文章目录
- 前言
- 1、如何创建(定义)一个函数
- 2、函数的调用
- 3、参数的类型
- 4、函数的注释
- 5、命名空间和作用域
- 5.1 命名空间
- 5.2 变量的作用域
- 5.2.1 全局作用域
- 5.2.2 函数作用域
- 5.2.3 全局与局部变量
- 5.2.4 函数内部修改全局变量
- 6、python中常见的四类形参
- 6.1 必选参数
- 6.2 默认参数
- 6.3 可变参数
- 6.4 关键字参数
- 7、匿名函数
- 练习题1
- 练习题2
- 8、递归函数
- 练习题1:求10的阶乘
- 练习题2:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
前言
1、如何创建(定义)一个函数
def 函数名(参数列表):
//实现特定功能的多行代码
return [返回值]
- 函数的输入叫参数, 函数的输出叫返回值。
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 在创建函数时,即使函数不需要参数,也必须保留一对空的“()”
- 如果想定义一个没有任何功能的空函数,可以使用 pass 语句作为占位符。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。在函数中,return后的代码都不会执行,return 一旦执行函数自动结束
创建一个函数,判断两个数的大小
def max(a,b): ## 函数名(参数列表), a,b为形参
return a if a>=b else b ##选择性地返回一个值给调用方
2、函数的调用
函数调用的基本语法格式:
- [返回值] = 函数名([形参值])
函数名即指的是要调用的函数的名称;形参值指的是当初创建函数时要求传入的各个形参的值。如果该函数有返回值,我们可以通过一个变量来接收该值,也可以不接受。
resault=max(2,5) ##resault变量接受返回值
print(resault) ##打印resault
3、参数的类型
参数的类型
- 形参: 形式参数,不是真实的值(定义函数时的参数)
- 实参:实际参数, 是真实的值(调用函数时的参数)
def max(a,b): ## a,b为形参
return a if a>=b else b
resault=max(2,5) ## 2,5为实参
print(resault)
4、函数的注释
函数注释包括:
- 参数注释:以冒号(:)标记
- 返回值注释:以 -> 标记
- 函数注释 在函数体中 “”" 填写功能说明 “”" 注释 填写对应功能即可
def max(a:int,b:int)->int:
"""
:param a: 整形a
:param b: 整形b
:return: 返回值为a和b中的最大值
"""
if isinstance(a,int)and isinstance(b,int):
return a if a>=b else b
else:
return 0
resault=max(2,5)
print(resault)
print(help(max)) ## 查看自定义函数的帮助
输出:
5
Help on function max in module __main__:
max(a: int, b: int) -> int
:param a: 整形a
:param b: 整形b
:return: 返回值为a和b中的最大值
None
5、命名空间和作用域
5.1 命名空间
内置空间: 即python解释器自带的函数 类似 print input len
全局空间:当前py文件需要开辟的空间存放在全局空间
局部空间:函数中开辟的空间就是局部空间
加载顺序:内置空间–全局空间–局部空间
取值顺序:局部空间–全局空间–内置空间
5.2 变量的作用域
5.2.1 全局作用域
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
5.2.2 函数作用域
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
5.2.3 全局与局部变量
- 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
- 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
(1)全局变量: 全局生效的变量,函数外面的变量。
a=3 ##a为全局变量
def prt():
return a
print(prt())
输出:3
(2)局部变量: 局部生效的变量,函数内部的变量。
a=3 ## 此处的a为全局变量
def prt():
a=2 ## 此处的a为局部变量
return a
print(prt()) ## 2
print(a) ## 3
5.2.4 函数内部修改全局变量
- 如果要在函数中修改全局的变量,不能直接修改。 需要用global关键字声明修改的变量是全局变量。
- 不可变数据类型修改全局变量一定要global声明, 可变数据类型不需要。
- 可变数据类型:list(列表), dict(字典),sets(集合)
- 不可变数据类型: 数值型, str, tuple
a=3 ##不可变数据类型
user=[] ##可变数据类型
def prt():
global a ## 声明a为全局变量
a=2
user.append('user1')
print(a,user)
prt() ## 2 ['user1']
print(a) ## 2
6、python中常见的四类形参
6.1 必选参数
必须要传递的参数
def max(a,b): ## 定义函数时指定形参
return a if a>=b else b
resault=max(1,3) ## 调用函数时,来传递实参
print(resault)
6.2 默认参数
可传可不传的参数,下边的函数中b为默认的参数,调用max函数时如果不指定b的值,此时b的值为默认值2;如果在调用函数时指定b的值,那么指定的b的值将会覆盖b的默认值
def max(a,b=2): ## 定义形参时,可以为形参指定默认值
return a if a>=b else b
resault=max(1)
print(resault)
输出: 2
def max(a,b=2):
return a if a>=b else b
resault=max(1,5)
print(resault)
输出:5
6.3 可变参数
- 参数的个数会变化,可以传0,1,2,3,…n
- args是元组
def max(*args):
return args
resault=max(1,5,6,7)
print(resault)
输出:
(1, 5, 6, 7)
- 带星号的形参只能有一个
- 带星号的参数,可以和其他参数配合使用
- 所有的参数都保存到args的元组中
- 可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递
- *形参只能接收位置参数,而不能接收关键字参数
6.4 关键字参数
- 参数的个数会变化,可以传0,1,2,3,…n:可以传递key和value
- kwargs存储在字典中
def max(**kwargs):
return kwargs
resault=max(a=1,b=2,c=5)
print(resault)
输出:
{'a': 1, 'b': 2, 'c': 5}
- **形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中
- 字典的key就是参数的名字,字典的value就是参数的值
- **形参只能有一个,并且必须写在所有参数的最后
7、匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数
- 利用匿名函数求两个数的和
result=lambda a,b:a if a>=b else b
print(result(2,3))
练习题1
num=[0,7,0,2]
num.sort(key=lambda num: 0 if num==0 else 1,reverse=True)
print(num)
输出:
[7, 2, 0, 0]
练习题2
偶数排前,奇数排后
num1=[3,7,0,2]
num1.sort(key=lambda num: 1 if num%2==1 else 0)
print(num1)
8、递归函数
- 递归的规律
- 退出递归的条件
练习题1:求10的阶乘
- 分析:
- 递归的规律:10!=109!,9!=98! …1!=1
- 退出递归的条件:1!=1
def factorial(n):
if n==1:
return 1 ## n=1时退出递归,返回值为1
else:
return n*factorial(n-1)
print(factorial(10))
练习题2:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
- 递归的规律:
F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)
- 退出递归的条件:
F(0)=0,F(1)=1
def fib(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-1)+fib(n-2)
print(fib(5))