python 函数
在python中,变量没有类型,一个对象的引用,类型属于对象
变量的本质上是一个占位符!通常用小写字母命名变量。
-----------------------------------------函数式编程------------------
一:语法
def 函数名(参数列表):
函数体
(函数名命名一般用小写字母 + 单下划线数字等组合)
二:常用函数的类型
(1)带参数的函数:参数须以正确的顺序传入函数
(2)默认参数函数:未传递参数,则会使用默认参数,默认参数不在最后,会报错!
(3)关键字参数:函数调用使用关键字参数来确定传入的参数值
(4)不定长参数:函数能处理比当初声明时更多的参数,
①*args中所有的变量都会被包装成一个元组存放所有未命名的变量
②**args中所有变量都会被包装成一个字典
(5)声明函数时,参数中星号 * 可以单独出现,*之后的的参数必须用关键字传入
(6)匿名函数,使用lambda函数创建匿名函数
①lambda 只是一个表达式,函数体比 def 简单很多
②lambda的主体是一个表达式,而不是一个代码块
③函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
三:python 函数的参数传递:
不可变类型:
类似 c++ 的值传递,如 int、string、tuple。
如fun(a),传递的只是a的值,没有影响a对象本身。
比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身.
可变类型:
类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,
修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,
我们应该说传不可变对象和传可变对象
四:变量作用域
python 中的作用域一般有四种:
l (local) 局部作用域
e (enclosing) 闭包函数外的函数中
g (global) 全局作用域
b (built-in) 内建作用域
查找规则是l->e->g->b
python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说
这些语句内定义的变量,外部也可以访问。
五:全局变量与局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
(1)global用来修改全局变量的值
(2)nonlocal要修改嵌套作用域(enclosing 作用域,外层非全局作用域)
中的变量则需要 nonlocal 关键字了
六:函数调用中的技巧(重要)
函数名.__doc__获取函数的帮助文档
函数名可以作为另一个函数的形参
多个返回值以元组的方式返回
内部函数,不修改全局变量可以访问全局变量!!
内部函数,修改同名全局变量,则python会认为它是一个局部变量!!
七:关于命名
(1)文件名:全小写,可以使用下划线
(2)函数名:小写,小驼峰原则
(3)变量名:全部小写,下划线连接
详细的命名规则参考pep8
八:几个特殊的函数(跟老乔学python)
------------函数式编程------------------
lambda
map
reduce
filter
------------暂留------------------
1 # --------------------------------------------------------------------------# 2 # 函数的语法及调用 3 # --------------------------------------------------------------------------# 4 5 6 def func(func_name, number): # 函数的定义 7 """打印输入的任何字符串""" 8 print(func_name, number) 9 return 'done' 10 11 12 func('func_1', 'faith') # 函数的调用 13 14 # --------------------------------------------------------------------------# 15 # 不定长参数函数,封装成元组 16 # --------------------------------------------------------------------------# 17 18 19 def func_1(func_name, *number): 20 """ 21 打印输入的任何字符串 22 """ 23 print(type(number)) 24 print(func_name, number) 25 return 'done' 26 27 28 func_1('func_1', 1, 2, 2, 3) 29 30 31 def func_2(func_name, number): # 32 print(type(number)) 33 print(func_name, number) 34 return 'done' 35 36 37 func_2('func_2', (1, 2, 2, 3)) 38 39 40 def func_3(func_name, *number): 41 print(func_name) 42 print(number[3]) # 根据元组index中一部分变量 43 print(number[4]) 44 return 'done' 45 46 47 func_3('func_3', 1, 2, 2, 3, 'aaa', 'abc') 48 49 50 # get out question: the number of index isn't known in most case! 51 # --------------------------------------------------------------------------# 52 # 不定长参数函数,封装成字典 53 # --------------------------------------------------------------------------# 54 55 56 def func_4(func_name, **number): # 可变参数必须在函数参数的最后 57 # print(type(number)) 58 print(func_name, number) 59 return 'done' 60 61 62 func_4('func_4', name='faith') 63 64 # --------------------------------------------------------------------------# 65 # 命名关键字函数 66 # --------------------------------------------------------------------------# 67 68 69 def func_5(a, x, c, *, china, uk): 70 print('func_5:', china, uk) 71 print(a, x, c) 72 73 74 func_5(1, 2, 3, china='bj', uk='rs') # 调用时必须加上关键字 75 # func_5(1, 2, 3, 'bj', 'rs') 76 77 # --------------------------------------------------------------------------# 78 # 函数应用之-递归 79 # --------------------------------------------------------------------------# 80 81 82 def my_sum(i): 83 if i < 0: 84 raise valueerror # 抛出错误 85 elif i <= 1: 86 return i 87 else: 88 return i + my_sum(i - 1) 89 90 91 print(my_sum(1.4)) 92 93 # --------------------------------------------------------------------------# 94 # 传递不可变对象实例 95 # --------------------------------------------------------------------------# 96 97 98 def change_int(a): 99 a = 10 100 101 102 b = 2 103 change_int(b) 104 print(b) # 结果是2 105 # --------------------------------------------------------------------------# 106 # 传递可变对象实例 107 # --------------------------------------------------------------------------# 108 109 110 def change_me(mylist): 111 mylist.append([1, 2, 3, 4]) 112 print("函数内取值: ", mylist) 113 return 114 115 116 mylist = [10, 20, 30] 117 change_me(mylist) 118 print("函数外取值: ", mylist) 119 120 # --------------------------------------------------------------------------# 121 # 函数内修改全局变量的值 122 # --------------------------------------------------------------------------# 123 124 money = 200 # 模块里面的全局变量 125 126 127 def add_money(): 128 global money 129 money = money + 1 130 return money 131 132 133 print("修改后的值money = ", add_money()) 134 135 136 # --------------------------------------------------------------------------# 137 # 匿名函数 138 # --------------------------------------------------------------------------# 139 sum_1 = lambda arg1, arg2: arg1 + arg2 140 141 # 调用sum函数 142 print("相加后的值为 : ", sum_1(10, 20)) 143 print("相加后的值为 : ", sum_1(20, 20)) 144 145 # 单独编译一个文件时候输出结果 146 if __name__ == "__main__": 147 pass