好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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?=?0y,m,d?=?map(int,?input('输入年?月?日:?').split())if?is_leap(y):
????md[1]?+=?1for?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?Iterableclass?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?sprint(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?rdef?hgt(h,?n):
????s?=?100
????for?i?in?range(1,?n):
????????s?+=?reb(h,i)?*?2
????return?sprint(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,?0for?i?in?range(1,?21):
????s?+=?b/a
????a,b?=?b,a+bprint(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测试数据/carbonfive/raygun")?==?"github"?
domain_name("http://HdhCmsTestzombie-bites测试数据")?==?"zombie-bites"
domain_name("https://HdhCmsTestcnet测试数据")?==?"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)],?[],?0for?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?reducedef?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)]]?*?3l2?=?[[randint(-100,?100)?for?_?in?range(3)]]?*?3s?=?[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?Counterdef?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^1 , 89 = 8^1 + 9^2 , 135= 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中元素的平方,忽略顺序。编写一个函数,参数为两数组 array1 和 array2 ,结果返回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?reducedef?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 + 1 和 z = 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?redef?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?redef?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))

查看更多关于Python3 50实例(Python3.7版本)的详细内容...

  阅读:71次