jQuery火箭图标返回顶部代码

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 

目前需要知道的

 

posted @   墨颜丶  阅读(165)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示
CONTENTS