python成长之路8——函数
一. 什么是函数
函数是用来封装一个功能的代码集合,我们可以调用这个函数来实现它所具备的功能。这样就可以实现代码的重复利用。
def 函数名(参数): 函数体 return 返回值 #函数是有默认的返回值的(None)
二. 参数
参数分为:普通参数,指定参数,默认参数,动态参数,万能参数
普通参数:
1 def f1(a): 2 print(a) 3 f1(123)
指定参数:
1 def f1(a,b): 2 print(a,b) 3 f1(a=123,b=456)
默认参数:
1 def f1(a,b=456): 2 #默认参数必须放在参数列表的后面 3 print(a,b) 4 f1(a=123)
动态参数:
#动态参数分两种: #第一种 def f1(*args): #默认传入的参数全部放在元祖中,按顺序传参时用 print(args) #调用函数时有两种方式: #方式一 f1(1,2,3,4) #方式二 li=["a","b","c","d"] f1(*li) 执行结果: (1, 2, 3, 4) ('a', 'b', 'c', 'd') #第二种 def f2(**kwargs): # 默认传入的参数全部放在字典中,按顺序传参时用 print(kwargs) #调用函数时也有两种方式: #方式一 f2(k1=1,k2=2,k3=3) #方式二 dic={"k1":"v1","k2":"v2","k3":"v3"} f2(**dic) 执行结果: {'k1': 1, 'k3': 3, 'k2': 2} {'k1': 'v1', 'k3': 'v3', 'k2': 'v2'}
万能参数:
def f1(*args,**kwargs): #将两种动态参数放在一起,就是万能参数 print(args) print(kwargs) #调用方式有两种: #方式一: f1(1,2,k1="v1",k2="v2") #方式二: li=["a","b"] dic={"k1":1,"k2":2} f1(*li,**dic) 执行结果: (1, 2) {'k2': 'v2', 'k1': 'v1'} ('a', 'b') {'k2': 2, 'k1': 1}
万能参数小例子:
s1="I am {0},age is {1}".format("zy","26") print(s1) print("-"*20) s2="I am {0},age is {1}".format(*["zy","26"]) print(s2) print("-"*20) k1="I am {name},age is {age}".format(age=26,name="zy") print(k1) print("-"*20) k1="I am {name},age is {age}".format(**{"age":26,"name":"zy"}) print(k1) 执行结果: I am zy,age is 26 -------------------- I am zy,age is 26 -------------------- I am zy,age is 26 -------------------- I am zy,age is 26
三. 函数注意事项
- 不管是函数还是类,有重名的时候,最后一个生效,上面的就都会被python回收
- 函数的参数进行传递的时候传的是引用还是值(copy)呢?传的是引用
四. 全局变量
- 全局变量要全部大写
- 全局变量在所有作用域都可读
- 全局变量要“重新赋值”必须加“global”
1 #全局变量在全部作用域可读 2 NAME="alex" 3 def f1(): 4 print(NAME) 5 f1() 6 print(NAME) 7 8 执行结果: 9 alex 10 alex 11 12 #全局变量重新赋值要global 13 AGE=18 14 def f2(): 15 AGE=999 #定义了一个局部变量,局部变量优先级高于全局变量 16 print(AGE) 17 f2() 18 print(AGE) #函数中的修改未影响全局变量 19 def f3(): 20 global AGE 21 AGE=999 #修改全局变量 22 print(AGE) 23 f3() 24 print(AGE) 25 26 执行结果: 27 999 28 18 29 999 30 999
五. 内置函数
1 #abs() 2 print(abs(-10)) 3 4 执行结果: 5 10 6 7 #abs() 8 print(abs(-10)) 9 #all() 全部为真才为真 10 #any() 有一个为真即为真 11 #all和any需要一个可迭代的参数,例如list等 12 #False:0,None,"",[],{},() 13 m=[1,2,3] 14 n=[1,2,0] 15 print(m,":",all(m)) 16 print(n,":",all(n)) 17 p=[0,None,[],{}] 18 q=[1,0,[],{}] 19 print(p,":",any(p)) 20 print(q,":",any(q)) 21 22 执行结果: 23 [1, 2, 3] : True 24 [1, 2, 0] : False 25 [0, None, [], {}] : False 26 [1, 0, [], {}] : True 27 28 #ascii(),参数是对象,自动执行对象的__repr__方法 29 class Foo: 30 def __repr__(self): 31 return "111" 32 f=Foo() 33 n=ascii(f) 34 print(n) 35 36 执行结果: 37 111 38 39 #bin() 10转2 40 #oct() 10转8 41 #hex() 10转16 42 #参数都是10进制数 43 print(bin(5)) 44 print(oct(9)) 45 print(hex(17)) 46 47 执行结果: 48 0b101 49 0o11 50 0x11 51 52 #bytes(要转换的字符串,编码),将字符串转换成字节码 53 # GBK:一个汉字是2个字节,UTF8:一个汉字是3个字节(每个字节8位,是用16进制表示的) 54 b=bytes("abcd",encoding="utf-8") 55 print(b) 56 c=str(b,encoding="utf-8”) #将字节码转换成字符串 57 print(c) 58 d=bytes("张燕",encoding="utf8") 59 print(d) 60 e=str(d,encoding="utf8") 61 print(e) 62 63 执行结果: 64 b'abcd' 65 abcd 66 b'\xe5\xbc\xa0\xe7\x87\x95' 67 张燕 68 69 print(bytes("张燕",encoding="GBK")) 70 71 执行结果: 72 b'\xd5\xc5\xd1\xe0’
三目运算:
1 #三目运算 2 a="1+1=2" if 1 + 1 == 2 else "1+1!=2" 3 print(a) 4 5 执行结果: 6 1+1=2 7 8 #lambda函数 9 #函数名=lambda 参数: 函数体 10 #默认有返回值 11 f1=lambda a,b: a+b 12 c=f1(2,5) 13 print(c) 14 15 执行结果: 16 7