05 函数

1 函数

特点:

  1. 方便使用,能重复使用
  2. 返回值后面的代码不会执行
  3. 不能调用外面的变量
# 要求:定义一个函数,函数功能是判断输入内容是否手机号(长度为11,都是数字)
def isPhone(phone):
    if phone.isdigit() and len(phone)==11:
        print('这是一个正确的手机号')
    else:
        print('这不是一个手机号')

>>> isPhone('11234567891')
这是一个正确的手机号
>>> isPhone('123')
这不是一个手机号


# 概念: 请看下面的代码,说说return在函数体的特征
def func(x,y):
    print(x) 
    print(y)
    return x+y
    print(111)  # return 后面的代码不会执行

res = func(1,2)
print(res)

# 结果:
# 1 -> print(x)
# 2 -> print(y)
# 3 -> res -> return x+y

# 答案:函数体返回的结果;唯一能从函数体出来的值;从函数体出来后需要由一个容器来容纳


查看函数体的返回值

def func(x,y=2,*args,**kwargs) -> str:
    print(x)
    print(y)
    print(args)
    print(kwargs)
    return 'abc'

help(func)
# 结果:
Help on function func in module __main__:

func(x, y=2, *args, **kwargs) -> str


函数中的参数

优先级类型实例备注
1必备参数def(x)必须传
2默认参数def(y=2)
3不定长参数①*args(元组)②**kwargs(集合、字典)②需要赋值才能
def func(x,y=2,*args,**kwargs):
    print(x) # 必备参数
    print(y) # 默认参数
    print(args) # 不定长参数
    print(kwargs) # 


>>> func(1,3,(1,2,3),[1,2,3],{'a':1,'b':1},a=1)
1 # x
3 # y=2
((1, 2, 3), [1, 2, 3], {'a': 1, 'b': 1}) # *args
{'a': 1} # **kwargs

全局变量和局部变量

在python,小范围不能打败大范围的

# 什么是全局变量? 什么是局部变量 ? 它们之前有什么关系?
x = 100  # 全局变量
def func():
    # 在函数里面对外部定义的x进行#修改
    y = 200  # 局部变量
    x = x+1
    prin
t(x)

>>> func()
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    func()
  File "C:\Users\William\Desktop\空文件 - 副本.py", line 5, in func
    x = x+1
UnboundLocalError: local variable 'x' referenced before assignment
>>> x
100


# 答案:全局变量:范围是全py文件;局部变量:只限于函数体里流动;两者都存在在同一个.py 文件里

如何将全局变量的值给局部变量使用?

# global —— 在局部变量前声明
x = 100
def func():
    global x  # 声明全局变量
    x = 200  
    print(x)

print(x)  # 100
func()    # 200
print(x)  # 200




在嵌套函数体的非第一层,如何声明变量不是局部的?

# 答案:nonlocal
def func1():
    x = 100
    def func2():
        nonlocal x  # 声明局部变量
        x = x+1
        print(x)
    return func2()


>>> func1()
101

闭包

定义:外层函数的RETURN返回外层函数的内层函数

 闭包
def func():
    lv = 5
    # 增加血量
    def func1():
        nonlocal lv
        lv += 1
        print(lv)
    # 减少血量
    def func2():
        nonlocal lv
        lv -= 1
        print(lv)
    # 外层函数返回内层函数的函数体,这就是闭包
    return func1,func2

func()
func()()
jia,jian = func()
jia()
>>>6
jian()
>>>5



def func():
    lv = 5
    # 增加血量
    def func1():
        nonlocal lv
        lv += 1
        print(lv)
    # 减少血量
    def func2():
        nonlocal lv
        lv -= 1
        print(lv)
    return func1(),func2()

>>> func()>>> func1()
101



def func():
    lv = 5
    # 增加血量
    def func1():
        nonlocal lv
        lv += 1
        print(lv)
    # 减少血量
    def func2():
        nonlocal lv
        lv -= 1
        print(lv)
    return func1,func2
# 以下打印结果为元组
>>> func() 
(<function func.<locals>.func1 at 0x00000259461FC1E0>, <function func.<locals>.func2 at 0x0000025946BBDE18>)
# 元组方法将其分开
>>> jia, jian = func()
>>> jia
<function func.<locals>.func1 at 0x0000022F95CDC1E0>
>>> jia()
6
>>> jian()
5


2 递归函数

通过自身调用自身,实现循环


def func(n):
    if n==1:
        return 1
    else:
        return func(n-1)*n
 func(n-1)*n

# func 的循环过程
func(5)
 ->【func(4)*5->【func(3)*4*5
 ->【func(2)*3*4*5
 ->【func(1)*2*3*4*5
 ->1*2*3*4*5=120

3 匿名函数

以下的函数结果是一样的,只是运行结果不同

a = lambda x:x+1 # 会自动返回,x是参数

def a(x):
    return x+1

什么时候用到匿名函数(lambda)。请对比一下表格:

li = [2,4,6,8,10]


def func(x):
    if x>5:
        return x
print(list(filter(func,li)))


print(list(filter(lambda x:x>5,li)))

4 其他函数

功能函数
过滤filter(函数体,可迭代对象)
统一操作map(函数体,可迭代对象)
合成字典,数据配对zip(可变对象,可变对象)
li = [2,4,6,8,10]


print(list(filter(lambda x:x>5,li)))

print(list(map(lambda x:x-1,li)))


tu = ('a','b','c')
li = [2,4,6]
print(dict(zip(tu,li)))
print(list(zip(tu,li)))

科普

回调函数

定义:把一个函数体当作另一个函数体的参数

def func1(f):
 f() # f = func2 -> f() = func2()
 print(111)

def func2():
 print(222)

func1(func2)

Bonus

1 空集合如何表示?
set1 = set()

2 help(函数()) 查看返回类型

下载:练习题

https://www.jianguoyun.com/p/DZPZFOMQnei5CBjE3ewD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值