Python——19.函数function

1.定义引用
def test(var):
    if var == "blueicex":
        print("blueicex")
    else:
        print("other")
test("blueicex")   
2.匿名函数 lambda

lambda 只是一个表达式。
语法lambda [arg1 [,arg2,…argn]]:expression
lambda表达式返回一个匿名函数,这个匿名函数可以赋值给一个变量。
匿名函数的返回值是冒号后面的表达式计算得到的结果。

sum = lambda x1,x2:x1+x2
print(sum(1,2)) 
L=[ lambda x: x * 2,
    lambda x: x * 3,
    lambda x: x * 4 ]

print(L[0](2))
print(L[1](2))
print(L[2](2))
def f1(x): return x * 2
def f2(x): return x * 3
def f3(x): return x * 4

L=[f1,f2,f3]

print(L[0](2))
print(L[1](2))
print(L[2](2))
key='four'
print(
    {
        'two':(lambda x: x * 2),
        'three':(lambda x: x * 3),
        'four':(lambda x: x * 4)
    }[key](2)
)

嵌套lambda匿名函数

def f(x):
    y=10
    return lambda z: x+y+z
3.函数返回值

函数返回值默认为Tuple

def get_birthday1(id):  
    year = id[6:10]
    month = id[10:12]
    day = id[12:14]
    return year, month, day


def get_birthday2(id):  
    year = id[6:10]
    month = id[10:12]
    day = id[12:14]
    return [year]


if __name__ == '__main__':
    print(get_birthday1('370104198003106655'))
    print(get_birthday2('370104198003106655'))
    print('test')***————Blueicex 2020/2/22 22:36 blueice1980@126.com***
('1980', '03', '10')
['1980']
test
4.函数默认值
def get_birthday(id, get_age=False):   
    if get_age:  
        return 2020 - int(id[6:10])  
    else:
        year = id[6:10]  
        month = id[10:12]   
        day = id[12:14]   
        return year, month, day  
5.函数抛出异常
def subtraction(num1, num2):   
    if not isinstance(num1, (int, float)) \ 
            or not isinstance(num2, (int, float)):   
        raise TypeError('参数类型错误,参数必须为整数或者小数。')  # 设定自定义异常内容
    result = num1 - num2   
    return result   

TypeError()为异常类型,括号中可以输入自定义的异常提示。

6.函数嵌套
def f():
    L=[]
    for i in range(5):
        L.append( lambda : i )
    return L

嵌套函数的作用域

x=3
def f():
    x=4
    g()
    print("f:",x)

def g():
    print("g:",x)

f()

输出
g: 3
f: 4
x=3
def f():
    x=4
    g()
    print("f:",x)

def g():
    print("g:",x)

x=6
f()
输出
g: 6
f: 4
x=3
def f():
    x=4
    def g():
        print("g:",x)
    print("f:",x)
    x=5
    return g

f()()
输出
f: 4
g: 5
7.函数返回值

python的函数支持返回多个值。返回多个值时,默认以tuple的方式返回。
两个函数的定义完全等价

def f():
    return 1,2

def f():
    return (1,2)
 
a, b = f()     # a=1, b=2
(a, b) = f()

赋值给一个变量,将会把整个元组赋值给变量。下面是等价的,a表示整个元组(1,2):

a = f()
(a) = f()
8.丢弃返回值

很多时候,多个返回值并非全都是所需的,这时候需要丢弃某些返回值。python有几种方式只获取部分返回值:

8.1 放在空上下文丢弃返回值

不进行任何赋值,将丢弃所有返回值
#f()的返回值全丢弃
f()

8.2 通过索引丢弃返回值

因为返回值是元组,所以可以通过索引取得某个或某几个返回值
a = f()[0]
b = f()[1]

8.3 使用下划线_丢弃返回值

#丢弃第二个返回值
a, _ = f()

8.4 使用双下划线__或更多下划线丢弃返回值

#丢弃第二个返回值
a, __ = f()
第三种方式"使用下划线"不是很安全,因为下划线_在python中有多种意义。而且正好有两种意义在某些情况下可能会产生冲突。所以,建议使用第四种方式。

9.函数作用域

按照从内到外,从小到大排序。函数作用域有4个层次范围:内部嵌套函数、包含内部嵌套函数的函数自身、全局作用域、内置作用域 。
内置作用域是预先定义好的,在__builtins__模块中。这些名称主要是一些关键字,例如open、range、quit等。
全局作用域是文件级别的,或者说是模块级别的,每个py文件中处于顶层的变量都是全局作用域范围内的变量。
本地作用域是函数内部属于本函数的作用范围,因为函数可以嵌套函数,嵌套的内层函数有自身的内层范围。
嵌套函数的本地作用域是属于内层函数的范围,不属于外层。

X=1
def out1(i):
    X=2
    Y='a'
    print(X)
    print(i)
    def in1(n):
        print(n)
        print(X,Y)
    in1(3)
out1(2)

处于全局作用域范围的变量有:X、out1
处于out1本地作用域范围的变量有:i、X、Y、in1
处于嵌套在函数out1内部的函数in1的本地作用域范围的变量有:n
当在某个范围引用某个变量的时候,将从它所在的层次开始搜索变量是否存在,不存在则向外层继续搜索。搜索到了,则立即停止。内层范围可以引用外层范围的变量,外层范围不包括内层范围的变量。

内置作用域主要是一些内置的函数名、内置的异常等关键字。例如open,range,quit等。
两种方式可以搜索内置作用域:一是直接导入builtins模块,二是让python自动搜索。导入builtins模块会让内置作用域内的变量直接置于当前文件的全局范围,自动搜索内置作用域则是最后的阶段进行搜索。
一般来说无需手动导入builtins模块,不过可以看看这个模块中包含了哪些内置变量。

>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', ...............
'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'su
9.1 变量覆盖

x=3
def g():
print(x) # 引用全局变量x

x=3
def g():
x=2 # 定义并赋值本地变量x
print(x) # 引用本地变量x

9.2 python是解释性语言,没有预编译功能
def g():
    print(x)
    x=3
g()

报错

UnboundLocalError: local variable 'x' referenced
before assignment

https://www.cnblogs.com/f-ck-need-u/p/9925021.html
————Blueicex 2020/2/22 23:11 blueice1980@126.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值