python之旅:三元表达式、列表推导式、生成器表达式、函数递归、匿名函数、内置函数
三元表达式#
#以下是比较大小,并返回值 def max2(x,y): if x > y: return x else: return y res=max2(10,11) print(res) #三元表达式仅应用于: #1、条件成立返回 一个值 #2、条件不成立返回 一个值 #三元表达式 def max2(x,y): return x if x > y else y print(max(10,11)) #三元表达式 #name='alex' 则返回SB,name=其他,则返回NB name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res)
列表推导式#
#1、示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2、语法 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] 类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression) #3、优点:方便,改变了编程习惯,可称之为声明式编程
生成器表达式#
#1、把列表推导式的[]换成()就是生成器表达式 #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性 >>> chicken=('鸡蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200> >>> next(chicken) '鸡蛋0' >>> list(chicken) #因chicken可迭代,因而可以转成列表 ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #3、优点:省内存,一次只产生一个值在内存中
四 声明式编程练习题#
1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写
2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度
3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)
4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)
5、思考题
with open('a.txt') as f: g=(len(line) for line in f) print(sum(g)) #为何报错?
6、文件shopping.txt内容如下
mac,20000,3 lenovo,3000,10 tesla,1000000,10 chicken,200,1
求总共花了多少钱?
打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]
求单价大于10000的商品信息,格式同上

#题目一 names=['egon','alex_sb','wupeiqi','yuanhao'] names=[name.upper() for name in names] #题目二 names=['egon','alex_sb','wupeiqi','yuanhao'] names=[len(name) for name in names if not name.endswith('sb')] #题目三 with open('a.txt',encoding='utf-8') as f: print(max(len(line) for line in f)) #题目四 with open('a.txt', encoding='utf-8') as f: print(sum(len(line) for line in f)) print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0? print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0? #题目五(略) #题目六:每次必须重新打开文件或seek到文件开头,因为迭代完一次就结束了 with open('a.txt',encoding='utf-8') as f: info=[line.split() for line in f] cost=sum(float(unit_price)*int(count) for _,unit_price,count in info) print(cost) with open('a.txt',encoding='utf-8') as f: info=[{ 'name': line.split()[0], 'price': float(line.split()[1]), 'count': int(line.split()[2]), } for line in f] print(info) with open('a.txt',encoding='utf-8') as f: info=[{ 'name': line.split()[0], 'price': float(line.split()[1]), 'count': int(line.split()[2]), } for line in f if float(line.split()[1]) > 10000] print(info)
函数递归#
1、递归调用的定义#
#递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
#直接调用 #死循环 def foo(): print('from foo') foo() foo() #间接调用 #也是死循环哦 def bar(): print('from bar') foo() def foo(): print('from foo') bar() foo()
2、递归分为两个阶段:递推,回溯#
#回溯: # 注意:一定要在满足某种条件结束后回溯,否则的无限递归
#递推: #总结: #1、递归一定要有一个明确地结束条件 #2、没进入下一次递归,问题的规模都应该减少 #3、在python中没有尾递归优化 #一个例子,a比b大两岁,b比c大两岁,c比d大两岁,e比f大两岁,f=18岁 #1、 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 # 2、 age(n)=18 age(n)=age(n-1)+2 # 3、 def age(n): if n == 1: return 18 return age(n-1)+2 print(age(5))
##########例子#############
items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def tell(l):
for item in l:
if type(item) is not list:
print(item)
else:
tell(item)
tell(items)
3、 python中的递归效率低且没有尾递归优化
#python中的递归 python中的递归效率低,需要在进入下一次递归时保留当前的状态,在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化:http://egon09.blog.51cto.com/9161406/1842475 但是python又没有尾递归,且对递归层级做了限制 #总结递归的使用: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
4、可以修改递归最大深度#
import sys sys.getrecursionlimit() sys.setrecursionlimit(2000) n=1 def test(): global n print(n) n+=1 test() test() 虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归
匿名函数#
1、什么是匿名函数#
匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3) #让其有名字就没有意义
2、有名字的函数与匿名函数的对比#
#有名函数与匿名函数的对比 有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能 匿名函数:一次性使用,随时随时定义 应用:max,min,sorted,map,reduce,filter
3、匿名函数示例#
#1、 def foo(x,y): #foo=函数的内存地址 return x ** y print(foo(2,3)) #2、例子1和2要的方式,结果都是一样的。但是明显2的方式更简洁 f=lambda x,n:x ** n # 赋值到x,y作运算 print(f(2,3)) #强调: #1 匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的 #2 匿名函数的参数规则、作用域关系与有名函数是一样的 #3 匿名函数的函数体通常应该是 一个表达式,该表达式必须要有一个返回值 #lambda匿名函数的应用 #max,min,sorted salaries={ 'egon':3000, 'alex':10000000, 'wupeiqi':10000, 'yuanhao':2000 } #max 函数---最大值 #求工资最高的那个人是谁? def get(x): return salaries[x] print(max(salaries,key=get))
内置函数#
#注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型 #更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii
目前需要知道的
作者: 墨颜丶
出处:https://www.cnblogs.com/moyand/p/8695236.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端