一、 三元表达式
一 、三元表达式
仅应用于:
1、条件成立返回,一个值
2、条件不成立返回 ,一个值
def max2(x,y): #普通函数定义 if x > y: return x else: return y res=max2(10,11) print(res) # res=x if x > y else y #三元表达式 # print(res) #def max2(x,y): #return x if x > y else y #代码简洁,方便 #print(max2(10,11))
二、 递归
一 、递归调用的定义
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
#直接调用 def foo(): print(‘from foo‘) foo() #foo() #间接调用 def bar(): print(‘from bar‘) foo() def foo(): print(‘from foo‘) bar() #foo()
二、 递归分为两个阶段:递推,回溯
1、回溯
(注意:一定要在满足某种条件结束回溯,否则就会无限递归)
#图解。。。 # salary(5)=salary(4)+300 # salary(4)=salary(3)+300 # salary(3)=salary(2)+300 # salary(2)=salary(1)+300 # salary(1)=100 # # salary(n)=salary(n-1)+300 n>1 # salary(1) =100 n=1 def salary(n): if n == 1: return 100 return salary(n-1)+300 print(salary(5))
三 、python中的递归效率低且没有尾递归优化
总结递归的使用:
1、 必须有一个明确的结束条件
2、 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3、 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
四 、可以修改递归最大深度
import sys sys.getrecursionlimit() #系统默认的可递归次数1000 sys.setrecursionlimit(2000) # 调整可递归为2000
三、 匿名函数
一 、什么是匿名函数?
#匿名就是没有名字 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) #让其有名字就没有意义
二、匿名的特点:
1、匿名的目的就是没有名字,给匿名函数赋给一个名字是没有意义的
2、匿名函数的参数规则、作用域关系与有名函数是一样
3、匿名函数的函数体通常应该是一个表达式,该表达式必须要有一个返回值
三 、有名字的函数与匿名函数的对比
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能
匿名函数:一次性使用,随时随时定义 应用:max,min,sorted,map,filter
salaries={ ‘egon‘:3000, ‘alex‘:100000000, ‘wupeiqi‘:10000, ‘yuanhao‘:2000 } # 求工资最高的那个人是谁 #print(max(salaries,key=lambda x:salaries[x])) #‘egon‘ 3000 # 求工资最低的那个人是谁 # print(min(salaries,key=lambda x:salaries[x]))
四、内置模块
注意:内置函数id()可以返回一个对象的身份,返回值为整数。
这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。
is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型
#更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii
二、内置函数详情
1、abs(x)
功能:取数的绝对值
1
2
|
>>> abs ( - 1 ) #取-1的绝对值 1 |
2、all(iterable)
功能:如果这个可迭代的元素都为真,则返回真(非0的就为真,负数也是为真)
1
2
3
4
|
>>> all ([ 0 , 9 ,- 3 ]) #有0,说明为假 False >>> all ([- 1 ,
5 , 6 ]) #负数也是为真 True |
3、any(iterable)
功能:可迭代的元素中,有一个为真,则返回真,没有真或空列表返回假。
1
2
3
4
|
>>> any ([ 0 , 0 , 2 ]) #有一个为真,则为真 True >>> any ([]) #空列表为假 False |
4、ascii(object)
功能:把内存对象变成一个可打印的字符串格式
1
2
|
>>> a = ascii([ 1 , 2 , 3 , 4 ]) >>> print(type(a),[a]) |
5、bin(x)
功能:把一个整数转换成二进制
1
2
3
4
|
>>> bin ( 300 ) #把300转换成二进制 ‘0b100101100‘ >>> bin ( 1 ) ‘0b1‘ |
6、bool([x])
功能:返回一个布尔值,空列表为假,不为空为真
1
2
3
4
5
6
|
>>> bool ([]) #空列表 False >>> bool ([ 1 , 2 ]) #不为空列表 True >>> bool ([ 0 ]) True |
7、bytes([source[, encoding[, errors]]])
功能:把字符串转换成字节
1
2
3
4
5
6
7
8
9
|
>>> b = bytes( "abcd" ,encoding = "utf-8" ) #声明字节 >>> b b ‘abcd‘ >>> b[ 0 ] #访问到‘a‘字符对应的ASCII值 97 >>> b[ 0 ] = 100 #不可以修改里面的值,不然会报错 Traceback (most recent call last): File "<input>" , line 1 , in <module> TypeError: ‘bytes‘ object does not support item assignment |
9、callable(object)
功能:判断一个对象是否可以被调用,只有在后面有括号的,表示可以调用,比如:函数,类。
1
2
3
4
5
|
>>> callable ([]) #列表后面不加括号 False >>> def sayhi(): pass #定义一个函数 >>> callable (sayhi) #函数调用,后面需要加括号 True |
10、chr(i)
功能:通过ascii的值(必须是数字),找到对应的字符
1
2
|
>>> chr ( 97 ) ‘a‘ |
11、ord(c)
功能:根据字符(必须ascii的字符),找到对应的ascii值
1
2
|
>>> ord ( ‘a‘ ) 97 |
13、dict(**kwarg)、dict(mapping, **kwarg)、dict(iterable, **kwarg)
功能:返回一个字典
1
2
3
4
5
6
7
8
|
>>> dict () #定义一个字典 {} >>> dict (name = ‘qianduoduo‘ ,age = 18 ) #传入非固定关键字参数 { ‘name‘ : ‘qianduoduo‘ , ‘age‘ : 18 } >>> dict ([( ‘name‘ , ‘qianduoduo‘ ),( ‘age‘ , 18 )]) #传入一个列表 { ‘name‘ : ‘zhangqigao‘ , ‘age‘ : 18 } >>> dict ([[ ‘name‘ , ‘qianduoduo‘ ],[ ‘age‘ , 18 ]]) #传入一个列表 { ‘name‘ : ‘qianduoduo‘ , ‘age‘ : 18 } |
17、dir([object])
功能:看一个对象有哪些方法
1
2
3
4
5
6
7
8
|
>>> name = [] >>> dir (name) #显示name下的所有的方法 [ ‘__add__‘ , ‘__class__‘ , ‘__contains__‘ , ‘__delattr__‘ , ‘__delitem__‘ , ‘__dir__‘ , ‘__doc__‘ , ‘__eq__‘ , ‘__format__‘ , ‘__ge__‘ , ‘__getattribute__‘ , ‘__getitem__‘ , ‘__gt__‘ , ‘__hash__‘ , ‘__iadd__‘ , ‘__imul__‘ , ‘__init__‘ , ‘__iter__‘ , ‘__le__‘ , ‘__len__‘ , ‘__lt__‘ , ‘__mul__‘ , ‘__ne__‘ , ‘__new__‘ , ‘__reduce__‘ , ‘__reduce_ex__‘ , ‘__repr__‘ , ‘__reversed__‘ , ‘__rmul__‘ , ‘__setattr__‘ , ‘__setitem__‘ , ‘__sizeof__‘ , ‘__str__‘ , ‘__subclasshook__‘ , ‘append‘ , ‘clear‘ , ‘copy‘ , ‘count‘ , ‘extend‘ , ‘index‘ , ‘insert‘ , ‘pop‘ , ‘remove‘ , ‘reverse‘ , ‘sort‘ ] |
18、divmod(a,b)
功能:地板除,获得一个元组,元组第一个元素是商,第二个元素是余数。
1
2
|
>>> divmod ( 5 , 2 ) ( 2 , 1 ) #2是商,1是余数 |
19、enumerate(iterable,start=0) 购物车的列表用到了,
功能:遍历一个可迭代对象,获取索引和对应的元素的
1
2
3
4
5
|
>>> seasons = [ ‘Spring‘ , ‘Summer‘ , ‘Fall‘ , ‘Winter‘ ] >>> list ( enumerate (seasons)) [( 0 , ‘Spring‘ ), ( 1 , ‘Summer‘ ), ( 2 , ‘Fall‘ ), ( 3 , ‘Winter‘ )] >>> list ( enumerate (seasons, start = 1 )) [( 1 , ‘Spring‘ ), ( 2 , ‘Summer‘ ), ( 3 , ‘Fall‘ ), ( 4 , ‘Winter‘ )] |
20、eval(expression, globals=None, locals=None)
功能:把字典类型的字符串变成字典,把一个整数类型的字符变成int类型,或者加减乘除这种简单转换成表达式。
1
2
3
4
|
>>> eval ( ‘1‘ ) #字符类型转换成int类型 1 >>> eval ( "1+3/2*6" ) #字符串转换为表达式 10.0 |
22、filter(function, iterable)
功能:通过function过滤条件,去获取iterable中你想要的数据。
1
2
3
4
5
6
7
8
9
|
>>> res = filter ( lambda n:n> 5 , range ( 10 )) >>> res #得到一个迭代器 < filter object at 0x0000000003093BE0 > >>> for i in res: print (i) 6 7 8 9 |
23、map(function, iterable)
功能:对传入的每一个值进行处理,处理完了再返回,再把原来的结果覆盖掉。
1
2
3
4
5
6
7
8
9
10
|
>>> res = map ( lambda n:n * 2 , range ( 5 )) #n*2是处理方式 >>> res < map object at 0x00000000031B4BE0 > >>> for i in res: print (i) 0 2 4 6 8 |
未完待续!