Python3 50实例(Python3.7版本)

Python3 50实例


文章目录

  • Python3 50实例
    • 实例1. 数字组合
    • 实例2. 奖金计算
    • 实例3. 完全平方数
    • 实例4. 判断某一天
    • 实例5. 斐波那契数列
    • 实例6. 乘法口诀表
    • 实例7. 生兔子问题
    • 实例8. 求素数
    • 实例9. 水仙花数
    • 实例10. 分解质因数
    • 实例11. 重复数相加
    • 实例12. 求完数
    • 实例13. 落球计算
    • 实例14. 猴吃桃问题
    • 实例15. 选手名单
    • 实例16. 菱形图案
    • 实例17. 分数序列之和
    • 实例18. 阶乘之和
    • 实例19. 递归求5!
    • 实例20. 回文数
    • 实例21. 列表唯一元素
    • 实例22. 列表最多元素
    • 实例23. 下个数的平方
    • 实例24. 提取域名
    • 实例25. 矩阵对角之和
    • 实例26. 有序列表插入元素
    • 实例27. 数组逆序输出
    • 实例28. 验证PIN码
    • 实例29. 递减的个位数
    • 实例30. 唯一数
    • 实例31. 矩阵相加
    • 实例32. 判断立方和
    • 实例33. 返回元素索引值
    • 实例34. 完全幂
    • 实例35. 奇数次整数
    • 实例36. 泰波那契数列
    • 实例37. 幂加数
    • 实例38. 变化字符串
    • 实例39. 移动0元素
    • 实例40. 更多的水仙花数
    • 实例41. 两数组“相同”
    • 实例42. 得到个位数次数
    • 实例43. 大数尾数
    • 实例44. 组成字符串
    • 实例45. 变形词
    • 实例46. 结尾字符加1
    • 实例47. 两次线性序列
    • 实例48. 转换字符串
    • 实例49. 报数问题
    • 实例50. 双份可乐

实例1. 数字组合

题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

num = [a*100 + b*10 + c for a in range(1, 5) for b in range(1, 5) for c in range(1,5) if ( a != b ) and (a != c) and (b != c)]

for i in num:
    print(i)

实例2. 奖金计算

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

p = float(input('当月利润(万元): '))
b = float(0)

ivs = [10, 10, 20, 20, 40]
rates = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
for i in range(len(ivs)):
    if p <= ivs[i]:
        b += p * rates[i]
        break
    else:
        b += ivs[i] * rates[i]
        p -= ivs[i]
else:
    b += p * rates[-1]

print('{:.2f}'.format(b))

实例3. 完全平方数

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

l = [a for a in range(-10000,10000) for b in range(100) for c in range(100) if a+100 == b*b and a+268 == c*c]

for i in l:
    print(i)

实例4. 判断某一天

题目:输入某年某月某日,判断这一天是这一年的第几天?

def is_leap(year):
    return (year%400==0 or (year%4==0 and year%100!=0))

md = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
res = 0
y,m,d = map(int, input('输入年 月 日: ').split())

if is_leap(y):
    md[1] += 1

for i in range(m-1):
    res += md[i]

print(res+d)

实例5. 斐波那契数列

题目:斐波那契数列。

def fib(n):
    a,b= 0,1
    
    for _ in range(1, n):
        a,b = b, a + b

    return b 

实例6. 乘法口诀表

题目:输出 9*9 乘法口诀表。

for x in range(1, 10):
    print()
    for y in range(1, x+1):
        print ('%s x %s = %s' % (y, x, y*x), end=' ')

实例7. 生兔子问题

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

分析:出生后第3个月就开始生,说明兔子两个月成熟。也是一个斐波那契数列,n为月数,sum为兔子对数。

def fib(n):
    a,sum= 1,1
    
    for _ in range(n-2):
        a,sum = sum, a + sum

    return sum

实例8. 求素数

题目:判断101-200之间有多少个素数,并输出所有素数。

from collections.abc import Iterable

class PrimeNumbers(Iterable):
    
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __iter__(self):
        for k in range(self.a, self.b + 1):
            if self.is_prime(k):
                yield k

    def is_prime(self, k):
        
        return False if k < 2 else all(map(lambda x: k % x, range(2, k)))


pn = PrimeNumbers(101, 201)

for n in pn:
    print(n, end= ' ')

实例9. 水仙花数

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

l = [a*100 + b*10 + c for a in range(1,10) for b in range(10) for c in range(10) if a*100 + b*10 + c == a**3 + b**3 + c**3]

for i in l:
    print(i, end=' ')

实例10. 分解质因数

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

import math

number = int(input("输入一个不小于1的正整数: "))
l = []

def prime_factors(n):
    square = int(math.sqrt(n)) + 1
    is_prime = True
    i = 2
  
    while i <= square:
        if n % i == 0:
            l.append(i)
            is_prime = False
            prime_factors(n // i)
            break
        i += 1
    if is_prime and n >= 2:
        l.append(n)

prime_factors(number)

for i in l:
    print(i, end=' ')

实例11. 重复数相加

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222,此时共有5个数相加。

分析:可用递归实现,n为数字,d为最大位数。

def my_sum(n,d):
    s = 0
    def num(d):
        if d == 1:
            m = n
        else:
            m = n*(10**(d-1)) + num(d-1)
        return m

    for i in range(1, d+1):
        s += num(i)
    return s

print(my_sum(2,5))

实例12. 求完数

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。

def factors(n):
    l = [i for i in range(1, n) if n % i == 0]
    return l
 
num = [i for i in range(2, 1001) if i == sum(factors(i))]

for x in num:
    print(x, end=' ')

实例13. 落球计算

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

def reb(h, n):
    r = h*(0.5**(n))
    return r

def hgt(h, n):
    s = 100
    for i in range(1, n):
        s += reb(h,i) * 2
    return s

print(hgt(100, 10))
print(reb(100, 10))

实例14. 猴吃桃问题

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

def peach(d):
    if d == 10:
        n = 1
    else:
        n = (peach(d+1)+1)*2
    return n

pick = peach(1) - peach(2)
print(pick)

实例15. 选手名单

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x、z比,请编程序找出三队赛手的名单。

分析:集合中元素不会重复。

a,b,c = set('xyz'),set('xyz'),set('xyz')

a -= set('x')
c -= set('xz')

i = {'a':i for i in a for j in b for k in c if len(set([i,j,k]))==3}
j = {'b':j for i in a for j in b for k in c if len(set([i,j,k]))==3}
k = {'c':k for i in a for j in b for k in c if len(set([i,j,k]))==3}

print(i, j, k, end=' ')

实例16. 菱形图案

题目:使用*打印出如下菱形图案:

   *
  ***
 *****
*******
 *****
  ***
   *

分析:总行数为2n-1,总列数为2x-1,即菱形最长为2x-1

def diamonds(n, x):
    a = "*" * (2*(x-n)+1)
    print(a.center(2*x-1,' '))

    if n != 1:
        diamonds(n-1,x)
        print(a.center(2*x-1,' '))

diamonds(4, 4)

实例17. 分数序列之和

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

a,b,s = 1.0, 2.0, 0

for i in range(1, 21):
    s += b/a
    a,b = b,a+b

print(s)

实例18. 阶乘之和

题目:求1+2!+3!+…+20!的和。

def sum_factorial(n):
    m,s = 1,0
    for n in range(1,n+1):
        m *= n
        s += m
    print(s)

sum_factorial(20)

实例19. 递归求5!

题目:利用递归方法求5!

def factorial(n):
    m = 0
    if n == 1:
        m += n
    else:
        m += n * factorial(n-1)
    return m

# print(factorial(6))

实例20. 回文数

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

def palindrome(s):
    res = 'yes' if s == s[::-1] else 'no'
    print(res)

s = str(abs(int(input('输入一个大于2位的整数: '))))
palindrome(s)

实例21. 列表唯一元素

题目:找出列表的中只出现一次的元素。

from collections import Counter

l = ['a', 1, 2, 2, 'c', 'b', 'c', 'a']

k = {k for k in Counter(l).keys() if Counter(l)[k] == 1}
print(k)

实例22. 列表最多元素

题目:找出列表中出现次数最多的元素。

from collections import Counter

l = ['a', 1, 2, 2, 'c', 'b', 'c', 'a', 'b', 2]

k = {k for k,v in Counter(l).items() if [(k,v)] == Counter(l).most_common(1)}
print(k)

实例23. 下个数的平方

题目:给定正整数m,判断它是否是另一个数的平方,是则返回该数+1后的平方,否则返回-1。

def next_power(m):
    n = 1
    while n <= m:
        if n**2 == m:
            return (n+1)**2
        n += 1
    return -1

实例24. 提取域名

题目:编写一个函数,当给定一个 URL 作为字符串时,只解析该域名并将其作为字符串返回。 例如:

domain_name("http://github.com/carbonfive/raygun") == "github" 
domain_name("http://www.zombie-bites.com") == "zombie-bites"
domain_name("https://www.cnet.com") == "cnet"
def domain_name(url):
    return re.search(r'(https?://)?(www\d?.)?(?P[\w-]+).', url).group('name')

实例25. 矩阵对角之和

题目:求一个3*3矩阵主对角线元素之和。

from random import randint

l1,l2,s = [randint(-100, 100) for _ in range(3)], [], 0

for i in range(len(l1)):
    l2.append(l1)
    s += l2[i][i]

print(s)

实例26. 有序列表插入元素

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

from random import randint

l,a = sorted([randint(-100, 100) for _ in range(10)]), randint(-100, 100)
l.insert(0,a)

print(sorted(l))

实例27. 数组逆序输出

题目:将一个数组逆序输出。

from random import randint

l = [randint(-100, 100) for _ in range(10)]

for i in sorted(l, reverse=True):               #按大小顺序反向输出
# for i in reversed(l):             #根据列表原排序倒着输出
    print(i, end=' ')

实例28. 验证PIN码

题目:Atm 机允许4位或6位的 PIN 码,PIN 码只能包含4位或6位数字。如果向函数传递了有效的 PIN 字符串,则返回True,否则返回False。

方法1:

def validate_pin(pin):
    if len(pin) == 4 or len(pin) == 6:
        if pin.isdigit():
            return True
    return False

方法2:

def validate_pin(pin):
    return len(pin) in (4, 6) and pin.isdigit()

实例29. 递减的个位数

题目:给定数字n,取组成n的数字的和。如果该值仍由多个数字组成,则继续以这种方式递减,直到有一个个位数产生为止。

方法1:

from functools import reduce

def digital_root(n):
    s = reduce(lambda a,b:a+b, [int(i) for i in str(n)])
    
    if len(str(s)) == 1:
        return s
    return digital_root(s)

方法2:

def digital_root(n):
    return n if n < 10 else digital_root(sum(map(int,str(n))))

实例30. 唯一数

题目:给定一个包含整数的数组(长度至少为3)。数组要么全由奇数组成,奇数组成的数组只能有一个偶数;要么全由偶数组成,偶数组成的数组只能有一个奇数。找出奇数数组中的唯一偶数或偶数数组中的唯一奇数。

def find_outlier(integers):
    l1,l2 = [k for k in integers if k % 2 == 1], [k for k in integers if k % 2 == 0]
    return l2[0] if len(l1) > len(l2) else l1[0]

实例31. 矩阵相加

题目 计算两个矩阵相加。对应位置依次相加,并放到结果矩阵的对应位置。

from random import randint

l1 = [[randint(-100, 100) for _ in range(3)]] * 3
l2 = [[randint(-100, 100) for _ in range(3)]] * 3

s = [l1[i][j] + l2[i][j] for i in range(len(l1)) for j in range(len(l1[0]))]
res = [s[:3], s[3:6], s[6:]]
print(res)

实例32. 判断立方和

题目:判断一个整数是否是另一个整数的立方和。给定立方和m,求整数x,不存在则返回-1。

def find_nb(m):
    n,s = 1,0
    while s < m:
        s += n**3
        if s == m:
            return n
        n += 1
    return -1

# print(find_nb(4183059834009))

实例33. 返回元素索引值

题目:对于一个长度至少为2的数组,给定整数m,判断m是否为数组中两个不同元素的和。如果是,返回元素索引值组成的元组,否则返回-1。

def two_sum(numbers, target):
    d = {i:j for i in range(len(numbers)) for j in range(len(numbers)) if numbers[i] + numbers[j] == target and i != j}
    
    for k in d.keys():
        t = (k,d[k])
        return t 
    return -1

实例34. 完全幂

题目:在数学中,完全幂是一个正整数,可以用另一个正整数的整数幂来表示。

编写一个函数,判断一个数n是否是完全幂,当a^b = n时则返回任意一对(a, b),否则返回None。对于b = 1的情况,只有在n = 1时才允许成立。

def isPP(n):
    a,b = 2,2
    
    if n == 1:
        return [1,1]
        
    while a >= 2:
        a = round(n ** (1/b))
        if a ** b == n:
            return [a, b]
        b += 1

# print(isPP(16))

实例35. 奇数次整数

题目:给定一个数组,该数组只有一个整数出现奇数次,找出出现奇数次的整数。

方法1:

from collections import Counter

def find_it(seq):
    return [k for k,v in Counter(seq).items() if v % 2 == 1][0]

方法2:

def find_it(seq):
    return [k for k in seq if seq.count(k) % 2][0]

实例36. 泰波那契数列

题目:与斐波那契数列的定义式T(n)=T(n-1)+T(n-2)类似,泰波那契数列的定义式为T(n)=T(n-1)+T(n-2)+T(n-3)

现在要定义一个函数,给定参数:长度为3的列表signature和非负整数n,以列表元素作为数列的前3个数,返回长度为n的泰波那契数列。

def tribonacci(signature, n):
    a,b,c = signature[0], signature[1], signature[2]

    for _ in range(n):
        a,b,c = b,c,a+b+c
        signature.append(c)
    return signature[0:n]

实例37. 幂加数

题目:所谓的幂加数,例如2 = 2^189 = 8^1 + 9^2135= 1^1 + 3^2 + 5^3。定义一个函数,给定参数a和b,求出它们之间的所有幂加数,返回一个列表。

def sum_dig_pow(a, b):
    return [i for i in range(a, b+1) if sum(int(v)**k for k,v in enumerate(str(i), 1)) == i]
    
# print(sum_dig_pow(1,100))

实例38. 变化字符串

题目:给定一个字符串,该字符串只含字母及空格,仅当出现多个单词时才会出现空格。对于单个单词,将单词的索引为偶数的字母转换为大写,将字符串的索引为奇数的字母小写,空格依旧是空格,所有字符顺序不变。转换字符串中所有的单词,返回转换后的字符串。

def to_weird_case_word(string):
    return ''.join(v.upper() if k%2 == 0 else v for k,v in enumerate(string))

def to_weird_case(string):
    return ' '.join(to_weird_case_word(i) for i in string.split())
    
# print(to_weird_case('Weird string case'))

实例39. 移动0元素

题目:编写一个函数,该函数接受一个数组,并将所有的0(不是False也不是float(0))移动到数组的最后,同时保持其他元素的顺序。

方法1:

def move_zeros(array):
    l,count = [],0
    for i in array:
        if str(i) != '0' and str(i) != '0.0' or i != 0:
            l.append(i)
        else:
            count +=1
    for i in range(count):
        l.append(0)
    return l

# print(move_zeros([0,1,None,2,False,1,0]))
# print(move_zeros([9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9]))

方法二:

def move_zeros(array):
    return sorted(array, key=lambda x: x==0 and type(x) is not bool)

实例40. 更多的水仙花数

题目:水仙花数是基于10进制的数字,它是自己组成数字的位数幂的和。例如,对于153(3位数):1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153;对于1634(4位数):1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634

现在编写一个函数,参数是基于10进制的数字,判断该数字是否是水仙花数,结果返回True或False。

def narcissistic(value):
    return sum(int(x)**len(str(value)) for x in str(value)) == value

实例41. 两数组“相同”

题目:给定两个数组a和b,判断b中的元素是否是a中元素的平方,忽略顺序。编写一个函数,参数为两数组array1array2,结果返回True或False。

def comp(array1, array2):
    try:
        return sorted([i**2 for i in array1]) == sorted(array2)
    except:
        return False

实例42. 得到个位数次数

题目:编写一个函数persistence,它接受一个正整数num作为参数并返回将num中的数字相乘的次数,直到你得到的乘积是一个个位数为止。

from functools import reduce

def persistence(n):
    count = 0
    while n >= 10:
        count += 1
        n = reduce(lambda a,b:a*b, [int(i) for i in str(n)])
    return count

实例43. 大数尾数

题目:编写一个函数,它接受两个非负整数a和b,并返回a^b的最后一位数。

方法1:

def last_digit(n1, n2):
    return int(str(n1**n2)[-1])

该方法效率极低,不可取。

方法2:

def last_digit(n1, n2):
    return pow(n1, n2, 10)

实例44. 组成字符串

题目:编写一个函数,给定参数str1和str2,判断一个字符串str1的部分字符可以重新排列组成另一字符串str2,则返回True,否则返回False。两个字符串参数只允许使用小写字母a-z

分析:需要考虑字符串str1中各元素的次数必须大于等于str2。

def scramble(s1, s2):
    return False if [i for i in set(s2) if s1.count(i) < s2.count(i)] else True

实例45. 变形词

题目:如果两个单词都包含相同的字母,那么它们就是对应的字母组合。例如:

'abba' & 'baab' == true

'abba' & 'bbaa' == true

'abba' & 'abbba' == false

'abba' & 'abca' == false

编写一个函数,它可以从一个列表中找到一个单词的所有字母组合。 给定两个参数,一个单词和一个包含单词的数组。 应该返回所有字母组合的数组,如果没有则返回空数组。例如:

anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']

anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer']

anagrams('laser', ['lazing', 'lazy',  'lacer']) => []
def anagrams(word, words):
    return [w for w in words if sorted(word) == sorted(w)]

实例46. 结尾字符加1

题目:编写一个函数,增加一个字符串,以创建一个新的字符串。如果字符串已经以一个数字结束,则该数字应该增加1,例如:

foo => foo1
foobar23 => foobar24
foo0042 => foo0043
foo099 => foo100

分析:如果数字前面有零,则应考虑数字的数量。

方法1:

def increment_string(string):
    if string.isalpha():
        return string + '1'

    def get_num(string):
        x,s1,s2 = 1,'',''
        while string[:x].isalpha():
            s1 = string[:x]
            s2 = string[x:]
            x += 1
        return s1,s2
    
    n = str(int(get_num(string)[1]) + 1).zfill(len(get_num(string)[1]))
    return get_num(string)[0] + str(n)

方法2:

def increment_string(string):
    head = string.rstrip('0123456789')
    tail = string[len(head):]
    return string + '1' if string == '' or string.isalpha() else head + str(int(tail) + 1).zfill(len(tail))

实例47. 两次线性序列

题目:对于一个序列u,u(0) = 1,对于在u中的每个元素x,都存在y = 2 * x + 1z = 3 * x + 1,u中无重复元素。例如:

u = [1, 3, 4, 7, 9, 10, 13, 15, 19, 21, 22, 27, ...]

编写一个函数,给定参数n,返回序列u对应索引的元素u(n)。

def dbl_linear(n):
    x,y,i,u = 0,0,1,[1]

    while i <= n:
        xx, yy = 2*u[x]+1, 3*u[y]+1
        
        if xx < yy:
            u.append(xx)
            x += 1
        elif xx == yy:
            u.append(xx)
            x += 1
            y += 1
        else:
            u.append(yy)
            y += 1
        i += 1
    return u[n]

实例48. 转换字符串

题目:编写一个函数,以输入的驼峰型字符串为参数,输出蛇形字符串,且全部小写,如果参数为数字,返回数字的字符串。例如:

to_underscore('TestController') => 'test_controller'

to_underscore('MoviesAndBooks') => 'movies_and_books'

to_underscore('App7Test') => 'app7_test'

to_underscore(1) => '1'

方法1:

import re

def to_underscore(string):

    def get_str(string):
        pattern="[A-Z]"
        return re.sub(pattern, lambda x:" "+x.group(0), string)[1:].lower()
    
    if str(string).isdigit():
        return str(string)
    return '_'.join(get_str(string).split())

方法2:

import re

def to_underscore(string):
    return re.sub(r'(.)([A-Z])', r'\1_\2', str(string)).lower()

实例49. 报数问题

题目:有n个人围成一圈,按顺序编号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

编写一个函数,给定参数n,返回最后剩下的人的编号。

def out(n):
    l1,c = list(range(1, n+1)),1

    while len(l1) != 1:
        l2 = []
        for i in l1:
            if c != 3:
                l2.append(i)
            c += 1
            if c > 3:
                c -= 3
        l1 = l2
    return l1[0]
    
# print(out(34))

实例50. 双份可乐

题目:编写一个函数,给定由至少包含1个名称的数组和单个整数n作为参数,返回喝第n杯可乐的人的名字。可乐从1开始编号,每人喝完双份可乐之后会排在队伍后面,例如,在Sheldon喝了第一罐可乐、Penny喝了第三罐可乐后,排队的人看起来是这样的:

Rajesh, Howard, Sheldon, Sheldon, Leonard, Leonard, Penny, Penny
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 1) == "Sheldon"
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52) == "Penny"
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 7230702951) == "Leonard"

方法1:

def who_is_next(names, n):
    i = 1
    while i <= n:
        names.append(names[0])
        del names[0]
        names.append(names[-1])
        i += 1
    return names[-1]

# print(who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52))

方法1效率较低,在n特别大时消耗时间较长。

方法2:

def who_is_next(names, n):
    while n > 5:
        n = (n - 4) // 2
    return names[n-1]

# print(who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52))

你可能感兴趣的:(#,Python小知识)