函数

  • 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 匿名函数力扣题

python为什么需要函数举例 python需要函数吗_数据类型

"""
问题描述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