4.1 函数的定义
-
函数的定义:
def 函数名(参数): pass return 表达式
函数名命名规则: 字母、数字和下划线组成,和变量命名规则一致 pass在这里表示什么都没有,不执行任何操作 return 后面可以返回任意表达式,但不能是赋值语句
-
函数调用:
-
return 和 print 的区别:
return没有写返回值的话,默认None
return是函数的返回值,返回值可以赋值给变量,而print只是打印出来
4.2 函数参数
-
必备参数:
1 def func(x): 2 print(x) 3 4 func(1)
-
默认参数:
1 def func(x, y=None): 2 print(x) 3 print(y) 4 5 func(1) 6 func(1, 2)
注意:默认参数要位于必备参数列表的后面
-
形参与实参
形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
1 def sq(data): #形参 2 print(data) 3 ret=123 4 sq(ret) #实参
-
不定长参数:
1 def func(*args, **kwargs): 2 print(args) 3 print(kwargs)
args: 参数包装成一个元组 kwargs: 参数包装成字典
调用1:func(1, 2, 3, a=4, b=5, c=6)
调用2:func(*(1, 2, 3), **{'a': 4, 'b': 5, 'c': 6})
1 def func(a,b,c): 2 print(a) 3 print(b) 4 print(c) 5 my_list=[1,5,2] 6 func(*my_list) 7 #一个 * 解包列表等 两个解字典 8
9 def foo(*args,**kwargs): 10 print( 'args=', args) 11 print('kwargs=', kwargs) 12 foo(1,2,3) 13 foo(a=1,b=2,c=3) 14 foo(1,'b','c',a=1,b='b',c='c') 15 foo(*["a","b","c"],**{"a":"a","b":"b"}) #列表、字典
ps:参数顺序(位置参数,*args,默认参数,**kwargs)
执行结果:
- print (func()): 函数返回值
- print (func) : 函数本身
4.3 Python中简单内置函数
-
内置对象查看:
dir(builtins)
-
常见函数:
len 求长度
min 求最小值
max 求最大值
sorted 排序
reversed 反向
sum 求和
-
进制转换函数:
bin 转换为二进制 oct 转换为八进制 hex 转换为十六进制 ord 字符转ASCII码 chr ASCII码转字符
-
一、内置函数
1.1、作用域相关
1 locals() #以字典的类型返回当前位置的全部局部变量。 2 globals() #以字典的类型返回全部全局变量。
1.2、迭代器生成器相关
1 range() #可创建一个整数对象,一般用在 for 循环中 2 next() #内部实际使用了__next__方法,返回迭代器的下一个项目。 3 iter() #用来生成迭代器(将一个可迭代对象,生成迭代器)同于:__iter__()
1.3、基础数据类型相关
1 bool() #用于将给定参数转换为布尔类型,如果没有参数,返回 False 2 int() #用于将一个字符串或数字转换为整型。 3 float() #用于将整数和字符串转换成浮点数。 4 list() #将一个可迭代对象转化成列表 5 tuple() #将一个可迭代对象转化成元祖 6 dict() #创建一个字典 7 set() #创建一个集合 8 str() #转化成字符串
1.4、转换及运算相关
1 bin() #将十进制转换成二进制并返回。 2 oct()#将十进制转化成八进制字符串并返回 3 hex()#将十进制转化成十六进制字符串并返回。 4 print(bin(10),type(bin(10))) # 0b1010 <class 'str'> 5 print(oct(10),type(oct(10))) # 0o12 <class 'str'> 6 print(hex(10),type(hex(10))) # 0xa <class 'str'> 7 abs()#返回数字的绝对值。 8 divmod()#计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。 9 round()#保留浮点数的小数位数,默认保留整数。 10 pow()#求x**y次幂。(三个参数为x**y的结果对z取余) 11 print(abs(-5)) # 5 12 print(divmod(7,2)) # (3, 1) 13 print(round(7/3,2)) # 2.33 14 print(round(7/3)) # 2 15 print(round(3.32567,3)) # 3.326 16 print(pow(2,3)) # 两个参数为2**3次幂 结果8 17 print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余。 余数2 18 sum()#对可迭代对象进行求和计算(可设置初始值)。 19 min()#返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值) 20 max()#返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值) 21 print(sum([1,2,3])) #6 22 print(sum((1,2,3),100)) #106 23 print(min([1,2,3])) # 返回此序列最小值1 24 ret =min([1,2,-5,],key=abs) # 按照绝对值的大小,返回此序列最小值 25 print(ret) #1 26 dic ={'a':3,'b':2,'c':1} 27 print(min(dic,key=lambdax:dic[x]))# x为dic的key,lambda的返回值(即dic的值进行比较)返回最小的值对应的键 28 print(max([1,2,3])) # 返回此序列最大值3 29 ret =max([1,2,-5,],key=abs) # 按照绝对值的大小,返回此序列最大值-5 30 print(ret) 31 dic ={'a':3,'b':2,'c':1} 32 print(max(dic,key=lambdax:dic[x]))# x为dic的key,lambda的返回值(即dic的值进行比较)返回最大的值对应的键 33 reversed() #将一个序列翻转,并返回此翻转序列的迭代器。 34 slice() #构造一个切片对象,用于列表的切片 35 ite =reversed(['a',2,3,'c',4,2]) 36 fori inite: 37 print(i) #2 4 c 3 2 a 38 li =['a','b','c','d','e','f','g'] 39 sli_obj =slice(3) 40 print(li[sli_obj]) #['a', 'b', 'c'] 41 sli_obj =slice(0,7,2) 42 print(li[sli_obj]) #['a', 'c', 'e', 'g'],开始、结束、步长 43 format() #与具体数据相关,用于计算各种小数,精算等 44 bytes()#用于不同编码之间的转化。 45 s ='你好' 46 bs =s.encode('utf-8') 47 print(bs) #b'xe4xbdxa0xe5xa5xbd' 48 bs =bytes(s,encoding='utf-8') 49 print(bs) #b'xe4xbdxa0xe5xa5xbd' 50 s1 =bs.decode('utf-8') 51 print(s1) #你好 52 bytearry()#返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256 53 ret =bytearray('jump',encoding='utf-8') 54 print(id(ret)) 55 print(ret) 56 print(ret[0]) 57 ret[0] =65 58 print(ret) 59 print(id(ret)) 60 memoryview() 61 ret =memoryview(bytes('你好',encoding='utf-8')) 62 print(len(ret)) #6 63 print(ret) #<memory at 0x008A0BF8> 64 print(bytes(ret[:3]).decode('utf-8')) #你 65 print(bytes(ret[3:]).decode('utf-8')) #好 66 ord()#输入字符找该字符编码的位置 67 chr()#输入位置数字找出其对应的字符 68 ascii()#是ascii码中的返回该值,不是就返回/u... 69 print(ord('a')) #97 70 print(ord('中')) #20013 71 #chr 输入位置数字找出其对应的字符 72 print(chr(97)) #a 73 print(chr(20013)) #中 74 #是ascii码中的返回该值,不是就返回/u... 75 print(ascii('a')) #"a" 76 print(ascii('中')) #'u4e2d' 77 repr()#返回一个对象的string形式
1.5、常用相关
1 id() #用于获取对象的内存地址 2 hash#获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值 3 print() #输出 4 input() #输入 5 open() #打开文件 6 type() #对象类型 7 len#返回一个对象中元素的个数(长度) 8 dir() #查看一个对象的方法 9 help() #帮助方法 10 isinstance() #来判断一个对象是否是一个已知的类型,类似 type() 11 a=123 12 isinstance(a,int) #True 13 __import__#用于动态加载类和函数 14 __import__('a') # 导入 a.py 模块
1.6、其他相关
1 eval()#执行字符串类型的代码,并返回最终结果 2 exec()#执行字符串类型的代码。 3 compile()#将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。 4 eval('2 + 2') # 4 5 s =''' 6 for i in [1,2,3]: 7 print(i) 8 ''' 9 exec(s) #1 2 3 10 complex()#函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。 11 filter()#过滤 12 deffunc(x):returnx%2==0 13 ret =filter(func,[1,2,3,4,5,6,7]) 14 print(ret) #<filter object at 0x006327B0> 15 fori inret: 16 print(i) #2,4,6 17 zip() #拉链方法 18 #用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同 19 l1 =[1,2,3,] 20 l2 =['a','b','c',5] 21 l3 =('*','**',(1,2,3)) 22 fori inzip(l1,l2,l3): 23 print(i) #(1, 'a', '*') (2, 'b', '**') (3, 'c', (1, 2, 3)) 24 map()#会根据提供的函数对指定序列做映射。 25 defsquare(x) : # 计算平方数 26 returnx **2 27 map(square, [1,2,3,4,5]) # 计算列表各个元素的平方 [1, 4, 9, 16, 25] 28 sorted()#对所有可迭代的对象进行排序操作 29 L =[('a', 1), ('c', 3), ('d', 4),('b', 2), ] 30 sorted(L, key=lambdax:x[1]) # 利用key[('a', 1), ('b', 2), ('c', 3), ('d', 4)] 31 students =[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] 32 sorted(students, key=lambdas: s[2]) # 按年龄排序[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 33 sorted(students, key=lambdas: s[2], reverse=True) # 按降序[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] 34 frozenset()#返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。 35 enumerate()#枚举,返回一个枚举对象 (可迭代对象加序号) 36 li =['a','b','c','d','e'] 37 fori inenumerate(li): 38 print(i) 39 forindex,name inenumerate(li,1): #索引默认从0开始,可改成1开始 40 print(index,name) 41 all()#可迭代对象中,全都是True才是True 42 any()#可迭代对象中,有一个True 就是True 43 callable() 检查是否是函数 返回True、False 44 defadd(x,y):returnx+y 45 callable(add) # 返回 True 46 a=123 47 callable(a) #返回False
1.7、类相关
1 object() #是Python中所有类的基类,如果定义一个类时没有指定继承哪个类,则默认继承object类。 2 staticmethod()#静态方法 3 classmethod()#是一个装饰器函数,用来标示一个方法为类方法 4 property()#静态属性 5 super() #用于调用父类(超类)的一个方法 6 issubclass() #方法用于判断参数 class 是否是类型参数 classinfo 的子类。如果 class 是 classinfo 的子类返回 True,否则返回 False。 7 vars() #返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals() 8 hasattr(object,name) #判断name是否在object,判断object中是否有一个叫name的方法或者属性 9 getattr(object,name,"xxx")#取object中name 的值,xxx为找不到报错信息,否则找不到报错 10 setattr(x,y,v) #给x对象中的y属性设置值v 11 delattr(x,y)#删除对象x中y
1.8、几个重要的内置函数
1 zip() 2 filter() 3 map() 4 max() 5 min() 6 sorted() 7 enumerate()
4.4 Python中高级内置函数
-
返回一个可以枚举的对象
enumerate
-
取出字符串中的内容
-
将字符串str当成有效的表达式来求指并返回计算结果
eval
-
执行字符串编译过的字符串 不返回结果
exec
-
过滤器
filter
-
对于参数中的每个元素都应用函数中,并将结果作为列表返回
map()
-
将对象逐一与()中的方法配对
zip
1 my_list=[1,2,5,6,9,8,7,4,5,66,55,54,444,] 2 def sorted_func(data,my_order): 3 if my_order is True: 4 result=sorted(data,reverse=False) 5 return result 6 elif my_order is False: 7 result = sorted(data, reverse=True) 8 return result 9 else: 10 print('youwenti') 11 12 print(sorted_func(my_list,True)) 13 14 ######### zip 15 16 my_dict={'a':100,'b':200,'c':300} 17 my_tuple=(400,500,'haha') 18 19 def exchange_list (my_dict,my_tuple): 20 new_dict= dict(zip(my_dict.keys(),my_tuple)) 21 new_tuple= tuple(my_dict.values()) 22 return new_dict,new_tuple 23 24 new_dict,new_tuple = exchange_list (my_dict,my_tuple) 25 print(new_tuple) 26 print(new_dict) 27 28 ############# map 29 30 a=[1,2,3,4] 31 def func (args): 32 return args*100 33 result=list(map(func,a)) 34 print(result) 35 36 ############ enumerate 37 38 a=[22,66,77,99,656] 39 for i in enumerate(a): 40 print(i) 41 42 ################ filter 43 44 a=[1,2,3,4] 45 def func(args): 46 if args>2: 47 return True 48 else: 49 return False 50 result=list(filter(func,a)) 51 print(result) 52
4.5 匿名函数
1 lambdaa,b:a**b 2 #关键字 参数:返回值 3 #参数可以有多个,用逗号隔开 4 #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值 5 #返回值和正常的函数一样可以是任意数据类型
4.6 函数作用域
外部不能访问函数内部变量:
数内部能够访问函数外部变量
函数里面不能修改函数外部变量
1 global(全局变量): 最外层 2 3 x = 123 4 def fun1(): 5 global x 6 x += 1 7 return x 8 9 nonlocal(局部变量): 上一层变量 10 11 def fun2(): 12 x = 123 13 def fun3(): 14 nonlocal x 15 x += 1 16 return x 17 return fun3()
4.7嵌套函数 闭包
- 嵌套函数
1 def func_out(): 2 def func_int(): 3 print('nei ') 4 return func_int 5 result=func_out() 6 result()
-
闭包:
闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包。
闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用,闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁
1 def fx(x): 2 x += 1 3 def fy(y): 4 return x*y 5 return fy 6 7 def func_out(times): 8 def func_int(num): 9 return times*num 10 return func_int 11 12 time_5=func_out(5) 13 print(time_5(100)) 14 15 time_8=func_out(8) 16 print(time_8(100)) 17
4.8递归和回调函数 (要有递归的终止条件)
1.递归:
函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件
1 def factorial(num): 2 if num ==1: 3 return num 4 return factorial(num-1)*num 5 6 print(factorial(6))
2.回调函数:
自身是一个函数,只是被传入到另一个函数当中,供其调用
回调函数不一定会被调用,是否调用由被传入函数的内部逻辑决定
1 def add (x,y): 2 return x+y 3 def multipy(x,y): 4 return x*y 5 def use(func,num1,num2): 6 return func(num1,num2) 7 8 a=10 9 b=20 10 print(use(add,a,b)) 11
4.9 肥波数列
1 def feib(num): 2 a=0 3 b=1 4 while b <num: 5 print(b) 6 a,b=b,a+b 7 8 feib(10) 9 def feib(num): 10 if num==1 or num==2: 11 return 1 12 return feib(num-1)+feib(num-2) 13 14 print(feib(5))