当前位置:   article > 正文

python函数

python函数

普通函数

基本定义及调用

语法:def 函数名(参数列表):

                        函数体

  1. #无参
  2. def hello():
  3. print("hello world")
  4. hello()
  5. #有参
  6. def sum(a,b):
  7. return a+b
  8. print(sum(2,9))
函数标注

形参得到标注方式是在形参后面加冒号和数据类型,函数返回值的标注方法是在形参列表的def语句结尾的冒号之间加上复合符号"->"和数据类型,但注意,函数标注仅仅是标注了参数和返回值的类型,不会限定参数和返回值的类型,在函数定义和调用时,参数和返回值的类型是可以改变的

  1. def fun(a:str,b:str="is my favourite")->str:
  2. s=a+" "+b
  3. print("函数标注",fun.__annotations__)
  4. print("传递的参数:",a,b)
  5. return s
  6. print(fun('python'))
  7. #函数标注 {'a': <class 'str'>, 'b': <class 'str'>, 'return':
  8. #<class 'str'>}
  9. #传递的参数: python is my favourite
  10. #python is my favourite
return语句

return[表达式]语句用于退出函数,选择性的向调用方返回一个表达式,不带表达式的return返回None

变量作用域

变量起作用的代码范围成为变量作用域。

在函数内部使用global来定义全局变量x,其同名全局变量在函数外已经定义,该变量在函数内外是同一个变量,所以在函数内部该变量所有的运算结果也反映到函数外

  1. x,y=2,200 #全局变量
  2. def fun():
  3. global x
  4. x,y=1,100 #局部变量的作用域仅在函数内部
  5. print("函数内部: x=%d,y=%d"%(x,y))
  6. print("函数外部: x=%d,y=%d"%(x,y))#调用函数前
  7. fun()
  8. print("函数外部: x=%d,y=%d"%(x,y))#调用函数后
  9. #函数外部: x=2,y=200
  10. #函数内部: x=1,y=100
  11. #函数外部: x=1,y=200

在以上代码中发现,全局变量y和局部变量y是两个不同的变量,局部变量y在函数fun()调用过程中不会改变全局变量y的值,说明局部变量与全局变量名字相同,局部变量会在函数内部屏蔽同名的全局变量。

 

如果函数内部用global定义的全局变量在函数外部没有同名的,则调用该函数后,创建新的全局变量。

  1. def fun1():
  2. global c
  3. c=90
  4. print(c)
  5. fun1()
  6. print(c)
  7. #90
  8. #90
 函数的递归调用
  1. 子问题需与原问题相同的问题,规模小且更简单
  2. 调用本身有边界条件

用递归的方式实现非负整数的阶乘

  1. def fun(n):
  2. if n==0:
  3. return 1
  4. else:
  5. return n*fun(n-1)
  6. print(fun(5))
  7. #120

使用递归方式求斐波那契数列的第n个元素

  1. def fun(n):
  2. fn=0
  3. if n==1:
  4. fn=0
  5. elif n==2:
  6. fn=1
  7. else:
  8. fn=fun(n-1)+fun(n-2)
  9. return fn
  10. print(fun(3))
  11. #1

匿名函数

匿名函数是没有采取使用def语句定义函数的标准方式,而用lambda方式俩简略定义的函数。匿名函数没有函数名,表达式只包含一个表达式,有以下特点:

1.表达式简洁

2.lambda表达式的主体只是一个表达式,而不是一个代码块,只能封装有限的逻辑。

3.匿名函数有自己的命名空间,不能访问自己参数列表之外或全局命名空间里的参数。

定义如下:

匿名函数名=lambda[arg1,[arg2......argn]]:expression

用匿名函数求两个数的平方差:

  1. fun=lambda x,y:x**2-y**2
  2. print(fun(7,6))

求1-20内偶数和的总和 

  1. fun=lambda a,b:sum(i for i in range(a,b+1)if i%2==0)
  2. print('the sum of even numbers between {} and {} is {}'.format(1,20,fun(1,20)))
  3. #the sum of even numbers between 1 and 20 is 110

参数传递

字符串,数字,元组是不可变对象,列表,字典是可变对象。

给参数传递不可变对象

  1. def fun (a):
  2. print("函数内部赋值前,变量值:",a,"变量地址:",id(a))
  3. a+=10
  4. print("函数内部赋值后,变量值:",a,"变量地址:",id(a))
  5. return a
  6. a=10
  7. print('函数外部调用前,变量值:',a,"变量地址:",id(a))
  8. fun(a)
  9. print('函数外部调用后,变量值:',a,"变量地址:",id(a))
  10. 函数外部调用前,变量值: 10 变量地址: 140719143406296
  11. 函数内部赋值前,变量值: 10 变量地址: 140719143406296
  12. 函数内部赋值后,变量值: 20 变量地址: 140719143406616
  13. 函数外部调用后,变量值: 10 变量地址: 140719143406296

给参数传递可变对象

  1. def fun (a):
  2. print("函数内部赋值前,变量值:",a,"变量地址:",id(a))
  3. a+=[5,6,7]
  4. print("函数内部赋值后,变量值:",a,"变量地址:",id(a))
  5. return a
  6. a=[1,2,3,4]
  7. print('函数外部调用前,变量值:',a,"变量地址:",id(a))
  8. fun(a)
  9. print('函数外部调用后,变量值:',a,"变量地址:",id(a))
  10. 函数外部调用前,变量值: [1, 2, 3, 4] 变量地址: 1424846803328
  11. 函数内部赋值前,变量值: [1, 2, 3, 4] 变量地址: 1424846803328
  12. 函数内部赋值后,变量值: [1, 2, 3, 4, 5, 6, 7] 变量地址: 1424846803328
  13. 函数外部调用后,变量值: [1, 2, 3, 4, 5, 6, 7] 变量地址: 1424846803328

总结:

1.不可变对象:调用函数传递不可变类型的值给a,传递的只是a的值,没有影响a本身,若在函数内部修改a的值,则生成一个新的a。

2.可变对象:调用函数传递可变类型的值给a,则是将a真正传递过去,在函数内部修改a后,函数外部的a也会收到影响。 

参数类型

位置参数

顺序与数量与声明时保持一致。

关键字参数

在函数调用时,参数的传入使用了参数的名称,此类参数成为关键字参数。注意:关键字参数必须在位置参数的后面

  1. def fun(a,b,c):
  2. print(a,b,c)
  3. return
  4. fun(1,c=2,b=3)
  5. #1 3 2

 当三个参数都是关键字参数时,顺序任意。

默认参数

函数定义时,某个参数使用了默认值,则该函数是默认参数。

不定长参数

如果希望函数的参数不确定,则使用不定长参数,定义方式有两种:

1.  *parameter

2.  **parameter

前者接收多个实参并将其放入一个元组中,后者则接收键值对并将其放入字典中

  1. def fun(*a):
  2. sum=0
  3. for i in a:
  4. sum+=i
  5. return sum
  6. print(fun(1,2,3,4,5,6))
  7. #21
  1. def fun(**a):
  2. print(a)
  3. for k,v in a.items():
  4. print(k,":",v)
  5. fun(name='zhangsan',id='00001',age='19')
  6. {'name': 'zhangsan', 'id': '00001', 'age': '19'}
  7. name : zhangsan
  8. id : 00001
  9. age : 19

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/582422
推荐阅读
相关标签
  

闽ICP备14008679号