简介
在编程中,我们经常需要进行相同或者类似的操作,这些操作是由一段代码完成的,而函数的出现,可以帮助我们避免重复编写这段代码。
函数的作用就是把相对独立的某个功能抽象出来,使之成为一个独立的实体。
Python在世界被广泛使用的一个原因,就是Python中有大量的内置函数,这些内置函数可以帮助我们快速的构建各种类型的网站。
常用的内置函数:max,min,sum,divmod等等;
函数必须要有输入和输出。
1、如何定义和调用函数
定义一个函数,只需要以def开头即可。
函数名(get_max):和Python中其他的标识符命名规则相同,有效的函数名以字母或者下划线开头,后面可以跟字母数字和下划线,函数名应该可以反映函数所执行的任务。
注意函数名区分大小写
函数参数(num1,num2):调用一个函数时可以传递的参数,参数可以是一个,多个或者没有参数。
函数内容:任何有效的代码都可以出现在函数内部。
函数返回值(return result):函数执行完后返回的值,也可以不返回任何内容,不返回内容可以视为返回“None”。
def get_max(num1,num2):
result = num1 if num1 > num2 else num2
return result
定义函数,函数的内容并不会执行
调用已经定义好的参数
def get_max(num1,num2):
result = num1 if num1 > num2 else num2
return result
max_num = get_max(30,80)
print(max_num)
得到返回值:
空函数
2、变量作用域
(1)全局变量
在函数外创建的变量,在全局生效的变量。
name在函数外创建,是全局变量。
def login():
print(name)
name = 'admin'
login()
返回admin
(2)局部变量
在函数内部创建的变量,只能在函数内部生效的变量。
def login():
name = 'admin'
login()
print(name)
报错,提示name未被定义,因为name在函数内部被定义,是局部变量。
(3)函数内部修改全局变量
当全局变量是不可变类型时:需要用global关键字声明修改的变量是全局变量。
当全局变量时可变类型时:不需要声明。
可变数据类型:list,dict,set
不可变数据类型:tuple,str,数值
代码中修改数值需要用global关键字声明,修改list不需要声明。
def hello():
global money
money += 10
users.append('user1')
print(money,users)
money = 100
users = []
hello()
执行结果:
3、函数参数
形参:形式参数,不是真实的值(定义函数时的参数)
实参:实际参数,是真实的值(调用函数时的参数)
(1)参数检查
isinstance(var,int) 判断变量var是否为int型
def get_max(num1:int,num2:int)->int: ##定义函数并且注释出num1和num2需要的数值类型和返回值的类型进行提示
""" ##使用三引号会自动生成格式,来写出函数的使用说明
求两数最大值
:param num1:整数型1
:param num2: 整数型2
:return: 最大值
"""
if isinstance(num1,int) and isinstance(num2,int): ##判断num1和num2是否为整型
return num1 if num1 > num2 else num2
else:
return 0
result = get_max(1,2)
print(result)
result1 = get_max(1,2.1) ##num2不是int型
print(result1)
执行结果:
(2)常见的四类形参
必选参数
函数定义的参数调用时必须调入,并且在调用的时候数量和顺序必须和定义函数时的参数保持一致。
默认参数
可传可不传的参数
def pow(x,y=2):
return x ** y ##x的y次方
result = pow(3)
print(result)
result = pow(2,4)
print(result)
执行结果:
可变参数
参数个数会变化,可以传0,1,2,3…n个参数
需要关键字*args,args是元组
def my_sum(*args):
print(args)
my_sum(1,2,3)
my_sum(1,2,3,4)
my_sum(1,)
my_sum()
执行结果:
关键字参数
kwargs存储在字典中
kwargs中可以自定义输入信息
def enroll(name,age=18,**kwargs):
print(f"""
入学信息:
1、姓名:{name}
2、年龄:{age}
3、其他:{kwargs}
""")
enroll('张三',country='china',english='GRE',sports=['篮球','羽毛球'])
执行结果如下:
4、拓展
匿名函数
匿名函数指一类无需定义标识符的函数或者子程序。
python用lambda语法定义匿名函数,只需用表达式而无需声明。(省略了用def声明函数的标准步骤)
注意:冒号前是输入的值,冒号后是输出的值。
get_max = lambda num1,num2: num1 if num1 > num2 else num2
print(get_max(11,22))
######################
S = lambda x,y=2: x ** y
print(S(2))
执行结果如下:
匿名函数对应的题目
实际上就是将数组用匿名函数重新排序,自己定义一个排序规则,然后再排序。
[ 0, 7, 0, 2 ]
[ 1, 0, 1 ,0 ]
这里的意思是如果nums内的元素num等于0,num就等于1,不等于0,num就等于0
然后用得到的数组再排序,最后输出。并未创建新的数。
nums = [0,7,0,2]
nums.sort(key=lambda num:1 if num==0 else 0)
print(nums)
拓展:将偶数排在前,奇数排在后
nums = [0,7,0,2]
nums.sort(key=lambda num:0 if num % 2 == 0 else 1)
print(nums)
递归函数
一个函数在内部调用自己本身,这个函数就是递归函数。
利用计算阶乘来说明:
阶乘就是n! = n*(n-1) *(n-2) … *1
def f(n):
"""
计算阶乘
:param n:输入的参数
:return: 返回的阶乘值
"""
if n == 1:
return 1
else:
return n * f(n-1)
print(f(4))
执行结果如下:
拓展:斐波那契数列
def Fs(n):
if n == 1 or n == 2:
return 1
else:
return Fs(n-1) + Fs(n-2)
print(Fs(4))
print(Fs(10))
执行结果如下: