概述
参考:Python推导式 - 最全用法
Pythonic
列表推导式
基本格式为:
-
[表达式 for 迭代变量 in 可迭代对象 <if 推导条件>]
-
[表达式 if 表达式条件 else 分支 for i in 序列 <if 推导条件>]
<if 推导条件> 可以省略。
# example
nums = []
for i in range(1, 101):
nums.append(i*i)
print(nums)
这种代码就不够 Pythonic,项目里更常见的是推导式:
nums = [i*i for i in range(1, 101)] # 生成1-100的平方的列表
nums = [i*i for i in range(1, 101) if i % 3 == 0] # 加入条件判断是否是3的倍数
nums = [i*i if i % 3 == 0 else i for i in range(1, 101)] #如果是3的倍数就平方,否则就数字本身
使用函数
推导所有1-100之间的所有质数
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)] # 会很卡
使用生成器
- 把方括号改成圆括号就可以了
nums = (i * i for i in range(1, 10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))
这是一个生成器,它不会一次性生成100亿个数字,只有调用 next() 的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。
字典推导式
推导字典的方式和推导列表很相似,只不过:
- 使用大括号
- 使用键值对
推导一个包含数字和数字平方组成的字典:
nums_dict = {n: n * n for n in range(1, 101)}
print(nums_dict)
给字典按照分数排序
scores = {'麦叔': 59, '张三': 87, 'FGA': 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)
- 先把字典scores变成一个元组列表:scores.items()
- 用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)
- 排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。
- 指定倒着排序,也就是分数高的在前面:reverse=True
- 使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in … }
集合推导式
推导集合的方式和列表是一样的,区别在于:
- 使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
- 集合会自动过滤掉重复的元素。
- 集合是无序的。每次输出顺序不一样
names = [ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]
new_names = {n.strip() for n in names}
print(new_names)
lambda 表达式
基本语法:
lambda [参数1[参数2, … 参数n]]: 表达式
与map结合
list_1=[1,2,3]
list_2=[10,20,30]
print(list(map(lambda x,y:x+y,list_1,list_2))) #输出 [11, 22, 33]
与reduce结合
from functools import reduce
print(reduce(lambda a,b: a+b ,[1,2,3,4])) # 输出10
与filter结合
num_list = [1,2,3,3,4,5,6,7,8,9,10]
print(list(filter(lambda x : x % 2 == 0, num_list))) # 输出 [2, 4, 6, 8, 10]
最后
以上就是精明鞋垫为你收集整理的python推导式Pythonic的全部内容,希望文章能够帮你解决python推导式Pythonic所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复