python3函数的使用方法
Python3.5基础之函数的定义与使用实例详解参数、作用域、递归、重载等本文实例讲述了python3.5函数的定义与使用。分享给大家供大家参考,具体如下:
1、函数学习框架
2、函数的定义与格式
(1)定义
(2)函数调用
注:函数名称不能以数字开头,建议函数名称的开头用小写的字母
(3)函数有四种格式,分别是:无参数无返回值,有参数无返回值、无参数有返回值、有参数有返回值
|
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:zhengzhengliu # 无参数无返回值 def hello(): # 函数体/方法体 print ( "hello world" ) hello() # 有参数无返回值 def add(x, y): print (x + y) add( 10 , 20 ) # 无参数有返回值 def sleep(): return "sleep" s = sleep() print (s) # print(sleep()) 等价于上面两句 # 有参数有返回值 def sub(x, y): return x * y res = sub( 12 , 6 ) print (res) |
运行结果
hello world
30
sleep
72
3、函数的参数
注:定义再函数体内的参数是形参,调用时传入的参数是实参。
函数参数包括:位置参数、关键字参数和不定个数参数
(1)位置参数、关键字参数
示例代码:
|
#位置参数 def test(x,y,z): print (x,y,z) test( 1 , 2 , 3 ) #关键字参数 def test1(x,y,z = 10 ): print (x,y,z) test1( 1 , 2 , 3 ) test1( 1 , 2 ) #关键字参数,z采用默认的参数值 test1(x = 2 ,z = 3 ,y = 1 ) #调用时的关键字参数 |
运行结果:
1 2 3
1 2 3
1 2 10
2 1 3
(2)默认参数
注:带有默认值参数的形参必须放在参数的最后面的位置。
(3)不定个数参数,用*args 和 **kwarg
总结:
(1)定义时 *的作用 将位置实参装配成元组
定义时 **的作用 将关键字实参装配成字典
(2)调用时 *作用 将元组或列表打散成位置参数进行参数传递
调用时 **作用 将字典打散成关键字参数进行参数传递
|
#不定个数参数 def test2(x,y,z, * args): print (x,y,z,args) #定义时 *的作用 将位置实参装配成元组 test2( 1 , 2 , 3 , 4 , 6 , 7 , 8 , 9 ) def test3(x,y,z, * * kwargs): print (x,y,z,kwargs) #定义时 **的作用 将关键字实参装配成字典 test3( 1 , 2 , 3 ,a = 6 ,b = 19 ,c = 8 ) def ts(x, * args, * * kwargs): print (x,args,kwargs) ts( 1 , 2 , 3 ,a = 6 ,b = 19 ,c = 8 ) def test4(x,y,z): print (x,y,z) x = [ 1 , 2 , 3 ] y = { "x" : 1 , "y" : "hello" , "z" : "你好" } test4( * x) #调用时 *作用 将元组或列表打散成位置参数进行参数传递 test4( * * y) #调用时 **作用 将字典打散成关键字参数进行参数传递 |
运行结果:
1 2 3 (4, 6, 7, 8, 9)
1 2 3 {'b': 19, 'a': 6, 'c': 8}
1 (2, 3) {'b': 19, 'a': 6, 'c': 8}
1 2 3
1 hello 你好
4、函数的传值:基本类型传值调用、非基本类型参数传递调用(强引用与弱引用)
|
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:zhengzhengliu #基本类型传值调用 def test(x): print (x) test( 10 ) #非基本类型参数传递调用 li = [ 1 , 2 , 3 , 4 ] print ( id (li)) #打印传递前的地址 def test1(x): print ( id (x)) x[ 0 ] = 2 #修改第一个参数为2 print (x) test1(li) #强引用(传址调用,列表里面的内容会进行修改) #test1(list(li)) #弱引用(用list可以消除强引用,不能修改列表里的元素) for i in li: print (i) |
运行结果:(强引用传址调用)
10
17741864
17741864
[2, 2, 3, 4]
2
2
3
4
|
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:zhengzhengliu #基本类型传值调用 def test(x): print (x) test( 10 ) #非基本类型参数传递调用 li = [ 1 , 2 , 3 , 4 ] print ( id (li)) #打印传递前的地址 def test1(x): print ( id (x)) x[ 0 ] = 2 #修改第一个参数为2 print (x) #test1(li) #强引用(传址调用,列表里面的内容会进行修改) test1( list (li)) #弱引用(用list可以消除强引用,传值调用,不能修改列表里的元素) for i in li: print (i) |
运行结果:(弱引用,传值调用)
10
18501544
18613272
[2, 2, 3, 4]
1
2
3
4
|
#不可变对象——传递对象的值,修改值修改的是另一个复制对象,不影响原来对象本身 def getnum(a): a = 10 print ( "函数内变量a的值:" ,a) a = 8 getnum(a) print ( "函数外变量a的值:" ,a) #可变对象——传递对象本身,函数内部修改值会影响对象本身 list01 = [ 0 , 1 , 2 , 3 ] def getnum1(num): num.append( 4 ) print (num) print ( id (num)) getnum1(list01) print (list01) print ( id (list01)) |
运行结果:
函数内变量a的值: 10
函数外变量a的值: 8
[0, 1, 2, 3, 4]
5908280
[0, 1, 2, 3, 4]
5908280
5、函数的返回值
示例代码:
|
#多个返回值 def re(a,b): a * = 10 b * = 10 return a,b num = re( 1 , 2 ) print ( type (num)) #如果返回多个值,并且存在一个变量中,会以元组的形式保存 print (num) #分别获取多个返回值 re1,re2 = re( 3 , 4 ) print ( type (re1)) print (re1,re2) |
运行结果:
<class 'tuple'>
(10, 20)
<class 'int'>
30 40
简单实例练习:
|
def operation(a,b,opt): if opt = = "+" : return a + b elif opt = = "-" : return a - b elif opt = = "*" : return a * b elif opt = = "/" : return a / b else : return "输入有误" num1 = int ( input ( "请输入第一个字符:" )) num2 = int ( input ( "请输入第二个字符:" )) op = input ( "请输入运算符:" ) result = operation(num1,num2,op) print (result) |
运行结果:
请输入第一个字符:1
请输入第二个字符:2
请输入运算符:+
3
6、变量的作用域:全局变量与局部变量
在函数的内部,不能识别全局变量,想要在函数内部使用全局变量,需要关键字global,但不建议这样使用,使用global具有污染性。
(1)局部变量
(2)全局变量
(3)当全局变量与局部变量同名时,优先使用局部变量
|
#全局变量与局部变量同名 a = 10 #全局变量 print ( "全局变量a:%d" % a) def test01(): a = 20 print ( "test01中的a:%d" % a) def test02(): print ( "test02中的a:%d" % a) test01() test02() |
运行结果:
全局变量a:10
test01中的a:20
test02中的a:10
(4)修改全局变量
|
#!/usr/bin/env python # -*- coding:utf-8 -*- # author:zhengzhengliu i = 20 def test(): #i += 10 #函数内部直接修改全局的值(错误) global i #函数内部修改全局的值用global关键字 i + = 10 print (i) #获取全局变量的值 test() |
运行结果:
30
注:上边代码中,函数内修改不可变类