一、Python函数的定义函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。函数还可以接收参数,并根据参数的不同做出不同的操作,最后再把处理结果返回给我们。函数的本质就是一段有特定功能、可以重复使用的代码。 二、函数的调用基本语法:
函数调用的基本语法格式:
三、函数值传递和引用传递在使用函数时,经常会用到形式参数(简称“形参”)和实际参数(简称“实参”),二者之间的区别是:
Python 函数的参数传递: ◆ 不可变类型:类似 C++ 的传值调用(实际上重新复制了一个副本给形参,不改变调用函数实参变量的内容),如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。 ◆ 可变类型:类似 C++ 的引用传递(也叫传址调用:将实参地址给形参,将改变调用函数实参变量的内容),如 列表,字典。如 fun(a),则是将 a 真正的传过去,修改后fun外部的a也会受影响 四、函数中的参数用法调用函数时常用的参数使用类型: ◆ 位置参数(必选参数):函数调用时,实参默认按位置顺序进行传递,并且要求个数和形参完全匹配。 ◆ 默认参数:调用函数时,默认参数的值如果没有传入,则被认为是默认值。 ◆ 命名参数 (关键字参数):使用关键字参数允许函数调用时参数的顺序与声明时不一致,通过参数名进行匹配。 ◆ 可变参数:你可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数或可变参数。 # 函数中参数的用法# 位置参数def location_param(a, b, c): print(a, b, c)location_param(1, 2, 3) # 1 2 3# 默认参数def default_param(a, b, c=20): # 默认值要放在最后面 print(a, b, c)default_param(8, 9) # 8,9,20 未传入默认值时,打印默认值default_param(8, 9, 10) # 8,9,10 传入默认值时,实际传入的值会覆盖默认值# 命名参数default_param(b=5, a=9, c=10) # 9 5 10 命名参数的顺序可以自定义# 可变参数-元组形式def variable_param_1(a, *b): print(a, b)variable_param_1(1, 2, 3) # 1 (2, 3)# 可变参数-字典形式def variable_param_2(a, **b): print(a, b)variable_param_2(1, name='jigang.chen', age=28) # 1 {'name': 'jigang.chen', 'age': 28}# 可变参数-万能参数def variable_param_2(*a, **b): # 元组参数要放在字典参数前面 print(a, b)variable_param_2(15252162666, '徐州市', name='jigang.chen',age=28) # 相同类型的参数要放在一起 (15252162666, '徐州市') {'name': 'jigang.chen', 'age': 28} 五、return函数返回值详解Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值,该返回值可以是任意类型。需要注意的是,return 语句在同一函数中可以出现多次,但只要有一个得到执行,就会直接结束函数的执行。 函数中,使用 return 语句的语法格式如下:
其中,返回值参数可以指定,也可以省略不写(将返回空值 None)。
六、变量作用域(全局变量和局部变量)所谓作用域(Scope),就是变量的有效范围,变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。 变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们只讲解两种变量: 局部变量和全局变量。 1.Python局部变量在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能使用了,我们将这样的变量称为局部变量(Local Variable)。 # 局部变量def local_variable(): age = 28 # 函数体内定义的变量为局部变量、无法被外部调用 print(f'函数体内的局部变量为:{locals()}')def local_variable_2(height, weight): # 函数传入的参数也是局部变量,只能在函数体内使用 print(height, weight)local_variable() # {'age': 28}local_variable_2('175cm', '75kg') # 175cm 75kg 2.Python全局变量除了在函数内部定义变量,Python 还允许在所有函数的外部定义变量,这样的变量称为全局变量(Global Variable)。 和局部变量不同,全局变量的默认作用域是整个程序,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用。
七、获取指定作用域范围中的变量1.globals()函数globals() 函数为 Python 的内置函数,它可以返回一个包含全局范围内所有变量的字典,该字典中的每个键值对, 键为变量名,值为该变量的值。 # 在函数体内调用def global_variable_3(): global work_number work_number = 227 print(f'函数体内的全局变量为:{globals()}')# 在函数体外调用print(f'函数体外的全局变量为:{globals()}') 2.locals()函数locals() 函数也是 Python 内置函数之一,通过调用该函数,我们可以得到一个包含当前作用域内所有变量的字典。 这里所谓的“当前作用域”指的是,在函数内部调用 locals() 函数,会获得包含所有局部变量的字典;
3.vars(object)函数vars() 函数也是 Python 内置函数,其功能是返回一个指定 object 对象范围内所有变量组成的字典。如果不传入 object 参数,vars() 和 locals() 的作用完全相同。 # 获取指定范围内的变量class demo: name = 'python' city = 'suzhou'print(vars(demo)) # {'__module__': '__main__', 'name': 'python', 'city': 'suzhou'...} 八、Python局部函数及用法(包含nonlocal关键字)Python还支持在函数体内定义函数,这种被放在函数体内定义的函数称为局部函数。 在默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭(enclosing)函数内有效。
nonlocal关键字:内部函数本身可以直接调用外部函数的变量,但若在内部函数想要声明一个和外部函数重名的变量,需使用nonlocal关键字声明 # 局部函数:在内部函数声明和外部函数相同名称的变量--nonlocaldef fun_f(): name = 'python' def fun_h(): nonlocal name # 若在内部函数想要声明一个和外部函数重名的变量,需使用nonlocal关键字声明 name = 'java' print(name) fun_h() 九、lambda表达式(匿名函数)及用法在定义函数的时候,不想给函数起一个名字,这个时候就可以用lambda来定义一个匿名函数,lambda 表达式, 又称匿名函数。 语法:
◆ 参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数 ◆ 表达式:不能包含循环、return,可以包含if...else... 可以理解 lambda 表达式,就是简单函数(函数体仅是单行的表达式)的简写版本。相比函数,lamba 表达式具 有以下 2 个优势:
十、递归在Python中,一个函数可以调用其他函数。函数甚至也可以调用自身,这类函数称为递归函数(Recursive Function)。如果一个函数直接或者间接地调用函数本身,那么就是递归函数。这意味着,函数将不断地调用本身并重复函数的内容,直到达到某个条件才返回一个结果。所有的递归函数都有着同样的结构,这个结构由两部分组成:基础部分,递归部分。 1.利用递归实现阶乘# 递归# 1!=1*1# 2!=1*2# 3!=1*2*3# ...# n!=1*2*3*...*n = n * (n-1)!# 阶乘函数def recursive_fun(n): if n == 1: return n else: n = n * recursive_fun(n - 1) return nprint(recursive_fun(4)) # 24 2.利用递归实现斐波那契数列
十一、函数式编程介绍函数式: 编程将一个问题分解成一系列函数,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。 函数式编程还具有一个特点:允许把函数本身作为参数传入另一个函数,还允许返回一个函数。 高阶函数: 函数对象也可以作为参数传递给函数,还可以作为函数的返回值。参数为函数对象的函数或返回函数对象的函数称为高阶函数,即函数的函数。 1.Python map()函数map() 函数的基本语法格式:
其中,function 参数表示要传入一个函数,可以是内置函数、自定义函数或者 lambda 匿名函数;iterable 表示 一个或多个可迭代对象,可以是列表、字符串等。 map() 函数的功能是对可迭代对象中的每个元素,都调用指定的函数,并返回一个 map 对象,不是list。 # map()函数def fun_a(x): return x ** 2list1 = range(1, 10)new_list = list(map(fun_a, list1))print(new_list) # [1, 4, 9, 16, 25, 36, 49, 64, 81] 2.Python filter()函数filter()函数的基本语法格式:
funcition 参数表示要传入一个函数,iterable 表示一个可迭代对象。 filter() 函数的功能是对 iterable 中的每个元素,都使用 function 函数判断,并返回 True 或者False,最后将返回 True 的元素组成一个新的可遍历的集合。
3.Python reduce()函数reduce() 函数通常用来对一个集合做一些累积操作,基本语法格式为:
其中,function 规定必须是一个包含 2 个参数的函数;iterable 表示可迭代对象。 注意:由于 reduce() 函数在 Python 3.x 中已经被移除,放入了 functools 模块,因此在使用该函数之前,需先导 入 functools 模块,需要引用:from functools import reduce from functools import reduce# reduce()函数list3 = (1, 3, 5, 7, 9)new_list2 = reduce(lambda x, y: x + y, list3) # + - * / 均可计算print(new_list2) # 25 总结本篇主要介绍Python函数相关的知识,涉及到的内容比较多,总体来说分为以下几个部分: 1.函数的定义、调用,形参、实参的定义; 2.函数的传值调用和传址调用:
3.变量作用域:
4.获取指定作用域范围中的变量:
5.局部函数:放在函数体内定义的函数称为局部函数,使用nonlocal关键字,可以在内部函数声明一个和外部函数重名的变量; 6.匿名函数--lambda:函数的简写版本,可以省去定义函数的过程,让代码更加简洁; 7.递归:利用递归实现阶乘以及斐波那契数列; 8.Python高阶函数:
|
|