函数
- 1.常用内置函数
- 2. 如何创建函数
- 3. 变量作用域
- 4.参数传递
- 4.1 形参和实参
- 4.2 参数检查
- 4.3 常见的四类形参
- 4.4 参数组合
- 5. 匿名函数
- 5.1 匿名函数定义
- 5.2 匿名函数力扣题
- 6.递归函数
- 7. 斐波那契数列
1.常用内置函数
#0.常用的内置函数 max,min,sum,divmod
#函数必须有输入和输出
max_num = max(1,2,3)
print(max_num)
2. 如何创建函数
- 从理论上说,不用函数,也能够编程,我们在前面已经写了程序,就没有写函数,当然,用python的内建函数姑且不算了。现在之所以使用函数,主要是:
1. 降低编程的难度(分而治之的思想)
2. 代码重用。避免了重复劳动,提供了工作效率。
3.
#定义一个什么事也不做的空函数,可以用 pass 语句;pass 可以用来作为占位符,还没想好怎么写函数的代码,
#就可以先放一个 pass ,让代码能运行起来。
# 1. 如何创建函数?定义函数,函数内容并不会执行
#函数的专业输入叫参数,函数的输出叫返回值
#重点:
# - 形参:形式参数,不是真实的值(定义函数时的参数)
# - 实参:实际存在的参数,是真实的值(调用函数时的参数)
def get_max(num1,num2): #形参
result = num1 if num1>num2 else num2
return result
# 2. 如何调用函数?
max_num = get_max(30,80) #实参
print(max_num)
3. 变量作用域
"""
可变数据类型:list,字典,集合
不可变数据类型:数值,str,tuple
"""
#1. 全局变量:全局生效的变量
def login():
print(name)
name='admin'
login()
#2.局部变量:局部生效的变量,函数内部的变量
def logout():
age = 19 #局部变量
print(age)
logout()
#print(age) #报错:NameError: name 'age' is not defined
#3.函数内部修改全局变量
#3-1)money是全局变量还是局部变量?全局
#3-2)如果在函数中修改全局变量,不能直接修改,需要用关键字global关键字声明变量是全局变量
#3-3)可变数据类型修改全局变量一定要global声明,可变数据类型不需要。
def hello():
global money
money+=1
users.append('user1')
print(money,users)
money = 100 #不可变数据类型
users = [] #可变数据类型
hello()
4.参数传递
4.1 形参和实参
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
4.2 参数检查
- 调用函数时,如果参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError;
如果参数类型不对,Python 解释器就无法帮我们检查。
数据类型检查可以用内置函数 isinstance 实现
# 2.参数检查 isinstance(var,int) 判断变量var的类型是否为整型
def get_max(num1:int,num2:int)->int:
if isinstance(num1,int) and isinstance(num2,int):
return num1 if num1>num2 else num2
else:
return 0
result = get_max(20,3.1) ##会有提示说明参数类型
print(result)
4.3 常见的四类形参
"""
必选参数:必须要传递的参数
默认参数
可变参数:元组
关键字参数:字典
"""
#1.必选参数:必须要传递的参数
def get_max(num1:int,num2:int)->int:
return num1 if num1>num2 else num2
result = get_max(20,3.1) ##会有提示说明参数类型
print(result)
#2.默认参数:可传可不传的参数
def pow(x,y=2):
return x ** y
result = pow(2) #x=2,y=2
print(result) #4
result = pow(2,4) #x=2,y=4
print(result) #16
#3. 可变参数:参数的个数会变化,可以传1,2,3,...,n个值
#args=arguments
#args是元组
def my_sum(*args):
return sum(args)
result = my_sum(1,2,3)
print(result)
#4.关键字参数:可以传递key和value
#kwargs存储在字典中
def enroll(name,age=18,**kwargs):
print(f"""
入学信息
1.姓名:{name}
2.年龄:{age}
3.其他:{kwargs}
""")
enroll('张三',country='china',english='GRE',sports=['篮球','羽毛球'])
4.4 参数组合
- 参数组合是指可以必选参数、 默认参数、 可变参数和关键字参数一起使用。
参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数
5. 匿名函数
5.1 匿名函数定义
- 匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
"""
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,
只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
lambda函数能接收任何数量的参数但只能返回一个表达式的值
"""
#def get_max(num1:int,num2:int)->int:
# return num1 if num1>num2 else num2
get_max = lambda num1,num2: num1 if num1>num2 else num2
print(get_max(10,20))
5.2 匿名函数力扣题
"""
问题描述2:(2018-携程-春招题)
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
输入: 数组的记录;0 7 0 2
输出: 调整后数组的内容; 7 2 0 0
0 7 0 2 #
1 0 1 0 #(1 if num==0 else 0)
0 0 1 0 #排序
"""
nums = [0,7,0,2]
#result = sorted(nums,key=lambda num: 1 if num==0 else 0) ##sorted自带的key功能
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)
#法二
nums = [0,7,0,2]
nums.sort(key=lambda num: 1 if num%2==0 else 0,reverse=True)
print(nums)
6.递归函数
- 一个函数在内部调用自己本身,这个函数就是递归函数
"""
leetcode 二叉树题目,大部分需要递归
一个函数在内部调用自己本身,这个函数就是递归函数
需求: 求n的阶乘。n!=n*(n-1)*(n-2)*...*1
"""
#方法一:通过for循环
res = 1
n =3
for i in range(1,n+1):
res=res*i
print(res)
#方法二:递归
# - 递归的规律
# - 退出递归的条件
n=3
def f(n):
if n==1:
return 1
return n*f(n-1)
print(f(5))
7. 斐波那契数列
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1) + fib(n-2)
# 1 1 2 3 5 8
print(fib(5)) #5