函数
自定义函数
函数的参数
函数的返回值
函数的作用域
函数介绍
函数的返回值介绍
当两个函数之间,想要互相使用到内部变量时,就可以应用到函数的返回值。
函数的返回值定义
- 使用 return 关键字返回内容
- 将内容 返回到 函数调用处
- 函数体中没有 return 语句时,函数运行结束,
则默认返回 None , 也被称为隐含返回值
小栗子:
摄氏度与华氏度关系如:摄氏度/1.8 + 32 = 华氏度
需求:
定义函数1:用于输出摄氏度
定义函数2:通过摄氏度计算得出华氏度
- 使用 return 关键字返回内容
- 将内容 返回到 函数调用处
- 函数体中没有 return 语句时,函数运行结束,
则默认返回 None , 也被称为隐含返回值
# 定义摄氏度函数
def c_temp():
c_t = 14
print(f'今天的摄氏度:{c_t}')
# 如果不做任何返回,默认返回值为None
# 将c_t返回到改函数的调用处
return c_t
# 调用华氏度
def f_temp(c_t):
f_t = round(c_t / 18 + 32)
print(f'今天的华氏度:{f_t}')
if __name__ == '__main__':
c_t_two = c_temp()
f_temp(c_t_two)
函数多个返回值
- 当执行函数体内代码时,遇到第一个 return 就将指定值返回到函数调用处,也就是执行到
return这行代码,后面的都不执行了。 - 多个返回值时,用逗号隔开,但默认为元组
def test_one():
a, b, c = (1, 2, 3)
# 函数当中有多个return不会报错,但是只执行第一个
# return a
# return b
# return c
# 相当于a,b,c打包返回,元组
return a, b, c
# res = test_one()
# print(res) # (1, 2, 3)
a, b, c =test_one() # 拆包
print(a) # 1
print(b) # 2
print(c) # 3
函数作用域介绍
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值
的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,
分别是:
- L(local):局部作用域,即函数中定义的变量;
-
E(enclosing):嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是
全局的; - G(global):全局变量,就是模块级别定义的变量;
- B(build-in):内建作用域,系统固定模块里面的变量,比如:int()等;
"""
注意: if判断,循环控制是没有作用域的概念。
"""
if True:
a = 5
print(a) # 5
for i in range(3):
print('hello')
print(i)
def test_one():
# 局部变量,该变量的作用域在函数体内部
a = 5
return a
print(222, a) # 报错
print(test_one()) # 5
# 全局变量
a = 100
def test_one():
print(f'a={a}') # 在局部没有时,则取全局变量中找。100
def test_two():
a = 200 # 局部变量
print(f'a={a}') # 当局部有该变量时,则优先局部的,200
test_one() # a = 100
test_two() # a = 200
global 关键字
当我们需要在函数内部直接修改全局变量时,我们可以将函数内部的局部变量通过 global 关键字声
明为全局变量。
# global
a = 100
def test_one():
print(f'a = {a}') # 10
def test_two():
# a = 20 # 方案一:初始化一个局部变量
# 方案二:局部变量-->全局变量
global a
a = a +10
print(f"a = {a}")
test_one() # a = 100
test_two() # a = 110
函数作用域的优先级
# built-in 只要在python环境中即可使用,了解,
# int()
# global
a = 11
def outer():
b = 5 # enclosing
def inner():
# nonlocal 是将local声明为enclosing
nonlocal b
b = 6 # local
print(b)
inner()
outer()
"""
1. 代码从上至下执行
2.函数只有调用的时候才会执行
3.函数执行完毕,则返回函数的调用处
"""
def test():
print('--5--')
def test2():
print("--3--")
test()
print('--4--')
def test3():
print('--1--')
test2()
print('--2--')
# 1 3 5 4 2
test3()
递归函数
递归的介绍
函数Func(args)直接或间接 调用函数本身,则该函数称为 递归函数。
小栗子:
阶乘本质:n! = 1 * 2 * 3 * ... * n
使用递归函数实现阶乘
# 实现阶乘
# n! = 1*2*3*...*n
# 3! = 1 * 2 * 3
i = 1
res_nums = 1
while i <= 3:
res_nums *= i
i += 1
print(f'3! = {res_nums}')
递归函数
注意
- 递归函数自身没有结束条件,所以需要我们自己设置结束条件,终止函数的调用。
- 可以使用递归实现的循环都可以实现,并且递归效率很低,所以递归很少使用
# 使用递归实现,在函数内部调用自己
# 递归没有结束条件,一定要自己设定结束条件
# 能够用递归实现,都可以用循环实现,递归效率低所以很少使用
def get_nums(num):
if num > 1:
return num * get_nums(num-1)
else:
return 1
res = get_nums(3)
print(res)
# 阶乘实现:1.循环 2.递归 3.reduce
# functools是内置的模块,所以不需要pip安装
from functools import reduce
def multi(x, y):
return x * y
# 相当于1,2先传入到multi中,在进行乘积返回,在将该结果于3传进入进行乘积返回...依次往后
# 注意:是两两传入
print(reduce(multi, range(1 ,4)))
内置文件中常用方法
zip()
zip()用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组
成的列表。
内置文件中常用方法
实现: 返回1-10的奇数列表
实现 : 阶乘,比如n!=123...n
方法一:
li = []
for i in range(1, 11):
if i % 2 == 1:
li.append(i)
print(li)
# 方法二:
li = []
for i in range(1, 11, 2):
li.append(i)
print(li)
# 方法三:
def is_odd(n):
# 布尔值,不管bool值为True还是False,都会返回出去。是filter做了过滤操作。
return n % 2 ==1
# filter函数,将range(1,11)中每个元素传到is_odd方法中进行条件判断,将结果为True的构建新的filter对象
print(list(filter(is_odd, range(1, 11))))
匿名函数
匿名函数介绍
当我们在传入函数时,有些时候,****不需要重复调用该函数***,直接传入匿名函数更方便,也无需担心
函数名冲突,并且还可以将匿名函数赋值给一个变量,再利用变量来调用该函数。
# 自定义函数
def f(x):
return x * x
print(f(3)) # 9
# lambda 形参:返回值
f = lambda x, y: x * y
print(f(2, 5)) # 10
# 匿名函数最为返回值
def fx(i, j):
# 返回匿名函数
return lambda :i*j
f = fx(6, 6) # lambda:i*j
print(f()) # 函数只有调用时才会执行
# 匿名函数作为实参
def test(a, b, func):
res = func(a, b) # 11 + 22
return res
nums = test(11, 22, lambda a,b:a+b)
print(nums) # 33
小栗子
将 lis = [4,-2,3,1] --> [1,-2,3,4]
infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]
以 name 对应的值进行排序
# [4, -2, 3, 1]-->[1, -2, 3 4]
# [4,2,3,1] --> [1,2,3,4] --> [1,-2,3,4]
li = [4, -2, 3, 1]
# key:指定排序规则,排序之后返回原元素
li.sort(key=abs)
print(li)
"""
infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]
以 name 对应的值进行排序
"""
infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]
# key: 排序键-->获取到每个字典当中name的值。如何获取,时应为infors列表中的每个元素(字典)
# 他作为实参传入x,但是因为,我们需要按照字典当中的name的值取排序,所以应当返回x['name']
infors.sort(key=lambda x: x['name'])
print(infors)
高阶函数
高阶函数需满足条件:
- 函数名 作为 参数传入
- 函数名 作为 返回值
# '''
# ü 作业 1
# 1. 定义一个函数 完成用户输入的三个数字的求和
# 以及在另一个函数求该和的平均值 ( 用到函数传参 , 函数返回值
# '''
#
# # 定义求和函数
# def get_sum(num_a, num_b, num_c):
# return num_a + num_b + num_c
#
#
# # 定义求平均值的函数
# def get_avg(num_sums, len_li):
# num_avg = round(num_sums / len_li, 2)
# print(f'和为:{num_sums}\n均值为:{num_avg}')
#
#
# if __name__ == '__main__':
# ipt_li = tuple(map(float, input('请输入:'.split())))
# num_sums = get_sum(*ipt_li)
# get_avg(num_sums, len(ipt_li))
"""
ü 作业 2
2. 将列表 l 输出如下。 l = ["jack",("tom",23),"rose",(14,55,67)]
提示 : 用递归实现
"""
l = ["jack",("tom",23),"rose",(14,55,67)]
# 如果遇到的是'jack' 'rose' 就直接输出
# 如果遇到的(,)就去遍历
# 方法一
def get_ele(l):
for item in l:
# isintance(x, A_tuple)判断x是否时A_tuple的类型
if isinstance(item, tuple):
get_ele(item)
else:
print(item)
get_ele(l)
# 方法二
def get_ele(l):
# 判断l时整数或者字符串
if isinstance(l, (int,str)):
print(l)
else:
for item in l:
get_ele(item)
get_ele(l)