一、 函数

1. 函数的嵌套

 1 def huangwei():  # 函数不能里面执行不执行外面
 2     name = 'huang'
 3     print(name)
 4 
 5     def liuyang():
 6         name = 'liuyang'
 7         print(name)
 8 
 9         def nulige():
10             name = 'fahsfha'
11             print(name)
12 
13         print(name)
14         nulige()
15         return nulige
16 
17     liuyang()
18     print(name)
19     return liuyang

 

(1) 仅仅是 huangwei()   顺序为1-2-3-17-5-6-7-13-14-9-10-11-15-18-19

(2) huangwei() = liuyang    所以要运行liuyang    应为  huangwei()()

(3)huangwei()() = nulige    所以要运行努力哥应为  huangwei()()()

2. 函数的自循环

 1 person_list = ['a', 'b', 'v', 'd', 'vd']
 2 
 3 def ask_way(person_list):
 4     print('-' * 60)
 5     if person_list == 0:
 6         return '根本没人知道'
 7     person = person_list.pop(0)
 8     if person == 'd':
 9         return '那条路是。。。。。'
10     print('hi %s ,你知道xx 路吗' % person)
11     print('%s 我不知道 我帮你问问 %s' % (person, person_list))
12     import time
13     time.sleep(0)  # time 要先import
14     res = ask_way(person_list)
15     return res
16 """------------------------------------------------------------
17 hi a ,你知道xx 路吗
18 a 我不知道 我帮你问问 ['b', 'v', 'd', 'vd']
19 ------------------------------------------------------------
20 hi b ,你知道xx 路吗
21 b 我不知道 我帮你问问 ['v', 'd', 'vd']
22 ------------------------------------------------------------
23 hi v ,你知道xx 路吗
24 v 我不知道 我帮你问问 ['d', 'vd']
25 ------------------------------------------------------------
26 那条路是。。。。。
27 """

3. lambda 函数

(1)匿名函数 一般和其他函数联合使用lambda x:x+1:         x 为形参,x+1是返回值 

  (2)函数式编程,函数体内不应该有任何的赋值操作 ,没有变量的定义

4. 参数

*args: 数组形式
**kvArgs:字典形式
def printInfo(name, *args):
    # 打印任何传入的字符串
    print("name is: ", name)
    for arg in args:
        print(arg)
    # 没有返回值
    return


# 正确调用
printInfo("KEN", 20, "", 178, "70KG", 'abc')

#name is:  KEN  20  男  178 70KG   abc


# 可变长参数的函数--kv方式
def printInfo(name, **kvArgs):
    # 打印任何传入的字符串
    print("name is: ", name)
    for k in kvArgs:
        print(k, "is: ", kvArgs[k])
    # 没有返回值
    return


# 正确调用
printInfo("KEN", age=20, sex="", height="178", weight="70KG")
"""
name is:  KEN
age is:  20
sex is:  男
height is:  178
weight is:  70KG
"""

 

 

二、迭代

y = x.__iter__()  将x 转换为可迭代对象,可以转换为迭代器

y.__next__()/ next(y)  进行迭代每一项元素的输出  ,一行代码输出一个,  如果太多了超出范围 会报错

yield    函数的yield 相当于return  但是return 只能执行一次, yield 可以执行多次

def test():
    yield S  # yield 相当于return
    yield 1
    yield 2
    yield 3  # yield 可以执行多次 ,但是return 只能执行一次
g = test()
print(g)
print((g.__next__()))
print((g.__next__()))
print((g.__next__()))
print((g.__next__()))
# 结果
# <generator object test at 0x10e240f20>
#{1, 2, 3}
#1
#2
#3

yield 可以保留函数的运行状态

def product_baozi():
    for i in range(100):
        print('正在生产包子')
        yield '一屉包子%s' %i
        print('正在卖包子')


pro_b = product_baozi()
print('-----')
chibz = pro_b.__next__()  #正在生产包子
print('来了一个人吃包子',chibz)  #  来了一个人吃包子 一屉包子0
chibz = pro_b.__next__()  # 正在卖包子    正在生产包子  yield值已经产生了
print('来了一个人吃包子',chibz)    #  来了一个人吃包子 一屉包子1   输出yield 值
chibz = pro_b.__next__()    # 正在卖包子  正在生产包子
print('----')
chibz = pro_b.__next__()  # yield 可以保留函数的运行状态

 

 三元表达式生成迭代器:

laobuji = ('鸡蛋%s' %i for i in range(10))  # 该成括号可以一个一个迭代 
#这是一个生成器表达式,直接形成了迭代器协议
print(laobuji.__next__())