赞
踩
写一段代码生成1到100之间的数字的平方的列表,答案是:
1,4,9,16...
如果你这样写,你就不Pythonic了:
nums = []
for i in range(1, 101):
nums.append(i * i)
print(nums)
正确的写法是使用Python的推导式:
nums = [i * i for i in range(1, 101)]
生成一个列表,包含1到100之间是3的倍数的数字的方法:
9, 36, 81...
代码:
nums = [i * i for i in range(1, 101) if i % 3 == 0]
生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:
1, 2, 9, 4, 5, 36...
代码:
nums = [i * i if i % 3 == 0 else i for i in range(1, 101)]
结合上面的3个例子,来看一下推导式总结:
[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]
如果推导条件或者表达式特别复杂怎么办?可以使用函数。
推导所有1-100之间的所有质数:2,3,5,7…
def is_prime(num):
if num == 1:
return False
for i in range(2, num):
if (num % i) == 0:
return False
else:
return True
p_nums = [i for i in range(1, 100) if is_prime(i)]
print(p_nums)
把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。
同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。
推导1900到2021年之间所有的年份,标记出闰年,生成结果:
1900, 1901, 1902, 1903, '闰1904'
代码:
def is_run(year):
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
return True # 整百年能被400整除的是闰年
else:
return False
else:
return True # 非整百年能被4整除的为闰年
else:
return False
ryears = [f'闰{y}' if is_run(y) else y for y in range(1900, 2021)]
print(ryears)
从2000年到2021年,生成每个月份:‘2000年:1月’, ‘2000年:2月’, ‘2020年:3月’, …, ‘2021年:12月’
monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]
这里有两个for循环,类似于:
monthes = []
for y in range(2000, 2022):
for m in range(1,13):
monthes.append(f'{y}年:{m}月')
是不是下面的特别容易懂?所以两层的循环不推荐使用推导式,哈哈。
那我为什么还要讲?你会碰到有人这么写,知道它的存在还是有点必要的。
推导出1到100亿之间的数字的平方,代码如下:
nums = [i * i for i in range(1, 10000000000)]
但是这段代码很可能会卡死你的电脑,除非你的电脑是超级计算机。因为它要在内存中做100亿次计算,然后保存这100亿个数字。
这种情况下,我们应该使用推导生成器,用法很简单:
nums = (i * i for i in range(1, 10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))
打印出来是一个生成器:
<generator object <genexpr> at 0x7fa0b422feb0>
1
4
9
这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。
推导字典的方式和推导列表很相似,只不过:
推导一个包含数字和数字平方组成的字典,结果是这样的:
{1: 1, 2: 4, 3: 9, ..., 100: 10000}
代码:
nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)
反过来,平方在前面,数字在后面:
nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)
给下面的字典按照分数排序:
{‘张三’:59, ‘李四’:87, ‘王五’:78, ‘赵六’:100, ‘刘七’:90}
排序结果:
{‘赵六’: 100, ‘刘七’: 90, ‘李四’: 87, ‘王五’: 78, ‘张三’: 59}
代码:
scores = {'张三':59, '李四':87, '王五':78, '赵六':100, '刘七':90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores)
推导集合的方式和列表是一样的,区别在于:
下面的名字列表,去掉前后空格后去掉重复的名字:
[ ‘麦叔’, ‘张三’, ’ 麦叔 ', 'NBA ‘, ‘张小三’, ‘NBA’, ‘石石’, ’ 莫名’, ‘莫名’ ]
推导结果:
{‘石石’, ‘NAB’, ‘张小三’, ‘莫名’, ‘张三’, ‘麦叔’}
代码:
names = [ '麦叔', '张三', ' 麦叔 ', 'NBA ', '张小三', 'NBA', '石石', ' 莫名', '莫名' ]
new_names = {n.strip() for n in names}
print(new_names)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。