day10 函数高级操作2

函数的的高级操作2

1.变量的作用域

变量在程序中能够使用的范围

2.全局变量

a.声明在函数或者类的外部的变量都是全局变量
b.变量的作用域从声明开始到整个py文件结束,任何位置都可以使用。

a = 10 #全局变量
for x in range(10):
    y = 20
    print(x)
print(x,y)
def func1():
    print("函数中:",a)
    print("函数中:",x,y)
func1()

3.局部变量

a.声明在函数内部或者类的里面的变量都是局部变量
b.局部变量的作用域从声明开始到函数结束,任何位置都可以使用。

def func2(num1,num2):
    print(num1,num2)
    aa = 11
    print(aa)
    for xx in range(10):
        print(xx)
    print(xx)

globle只能在函数中使用,作用是用来在函数中声明一个全局变量。

语法
global 变量
变量名 = 值

a1 = 100
def func3():
    a1 = 200    
    print(a1)
func3()
print(a1)
a1 = 100
def func3():
    global a1   #使用globle对a1进行赋值,对全局变量进行改变
    a1 = 200
    print(a1)
    global b1
    b1 = 300
func3()
print(a1)
print(b1)

nonlocal关键字只能在函数中使用

当需要在局部的局部中修改局部变量的值,就使用nonlocal
语法:
nonlocal 变量名
变量名 = 值

def func3():
    #s声明一个局部变量
    a2 = "abc"
    def func11():
        #需求:修改a2的值
        nonlocal a2
        a2 = "python"
        print("a2的值:",a2)
        #a3d的作用域在func11中
        a4 = 111
        return a4
    a3 = func11()
    print("a2的值:",a2)
    print(a3)
func3()

练习头脑:

function = []
for x in range(5):
    def func1(a):
        return a*x
    function.append(func1)
a = function
x = 4
print(a)

t1 = function[0]=func1
t2 = function[1]=func1
t3 = function[2]=func1
t4 = function[3]=func1
t5 = function[4]=func1
print(t1(2),t2(2),t3(2),t4(2),t5(2))

4.函数作为变量

python中声明函数其实就是声明一个类型是function的变量,函数名就是变量
函数名作为变量除了可以用来调用函数获取返回值以外,普通变量能做的函数都能做,
引子:

声明类型是int类型的变量

a = 10

声明类型是dict的变量

b = {"a":1,"b":2}

声明类型是function类型的变量

c = lambda x:x*x
def d(x):
    return x*x
print(d)

声明一个列表变量

list1 = [1,2,3]

使用列表变量list1给list2赋值

list2 = list1
print(list2[0])

声明一个function函数变量func11

def func11():
    print("这是函数")
#使用函数变量func11给ff赋值
ff = func11
# 将ff当成函数来使用。
ff()    #调用函数。就相当于你的小名、
#声明一个变量2
def func2():
    print("我是函数2")
list2 = [func2,100]
print(list2[0]())

4.函数作为函数的参数

将函数最为实参,传递给函数2,这儿的函数2就是一个高阶函数(实参高阶函数)
先将func4传给func3作为func3的实参,调用funn3,将func3的形参赋值为func4,打印func4的地址,判断是否满足类型要求,此时的x()相当于func4()。因为是func4函数作为func3的实参,所以是x全部替换为func4。func4()调用func4函数,打印“我是函数444”

def func3(x):
    print(x)
    if not isinstance(x,int):
        x()
def func4():
    print("我是函数444")
print(func3(func4))

sort函数特别点

sort(self, key=None, reverse=False)
key -确定排序的时候,以什么值为标准来排序,默认以列表元素的大小为标准类排序。它需要传一个函数,必须要有一个参数和一个返回值。参数是列表的元素
reverse - 是否降序排序,需要一个bool值。
sort函数封装与应用1:

def yt_sort(list1,key = None):
    if key == None:
        for index in range(len(list1)):
            for index2 in range(index+1,len(list1)):
                curren = list1[index]
                biind = list1[index2]
                if biind < curren:
                    list1[index],list1[index2] = list1[index2],list1[index]
    else:
        for index in range(len(list1)):
            for index2 in range(index+1,len(list1)):
                curren = key(list1[index])
                biind = key(list1[index2])
                if biind < curren:
                    list1[index],list1[index2] = list1[index2],list1[index]
my_list = [1,34,89,8,20]
yt_sort(my_list)
print(my_list)
def yt_sort(list1,key = None):
    if key == None:
        for index in range(len(list1)):
            for index2 in range(index+1,len(list1)):
                curren = list1[index]
                biind = list1[index2]
                if biind < curren:
                    list1[index],list1[index2] = list1[index2],list1[index]
    else:
        for index in range(len(list1)):
            for index2 in range(index+1,len(list1)):
                curren = key(list1[index])
                biind = key(list1[index2])
                if biind < curren:
                    list1[index],list1[index2] = list1[index2],list1[index]
my_list2 = [{"name":"lorry","age":23},
            {"name":"lorrybz","age":50}
            ]
def sort_age(x):
    return x["age"]
yt_sort(my_list2,sort_age)
print(my_list2)

练习按最大年龄以及按照姓名进行取值。疑问。

my_list3 = [1,34,89,8,20]
my_list2 = [{"name":"lorry","age":23},
            {"name":"lorrybz","age":50}
            ]
max_age = max(my_list2,key=lambda x:x["age"])
print(max_age)
max_name = max(my_list2,key=lambda x:x["name"])
print(max_name)

按列表中第二个元素获取最大值.疑问。

#
list5 = [("a",30),("b",30),("c",20)]
max_value = max(list5,key = lambda item:item[1])
print(max_value)

6.变量作为函数的返回值也叫高阶函数

def func3(n):
    sum1 = 1
    for x in range(1,n+1):
        sum1 *= x
    return sum1
re = func3(5)+10
print(re)

根据不同的符号,返回不同的功能(函数功能的描述)

def get_operation(char):
    """
    根据不同的符号,返回不同的功能(函数功能的描述)
    :param char: 运算符符号
    :return: 不同运算符对应的功能的函数
    """
    if char == "+":
        def sum1(*args,**kwargs):
            """
            求多个数的和
            :param args: 
            :param kwargs: 
            :return: 
            """
            sum2 = 0
            for item in args:
                sum2 +=item
            for key in kwargs:
                sum2 +=kwargs[key]
            return sum2
        return sum1
    elif char == "*":
        def mul(*args,**kwargs):
            cj = 1
            for item in args:
                cj *= item
            for key in kwargs:
                cj *= kwargs[key]
            return cj
        return mul
    elif char == "-":
        def sub(*args,**kwargs):
            index = 1
            first = args[0]
            while index <= len(args)-1:
                first -= args[index]
                index += 1
            return first
        return sub
    else:
        print("不支持")
        return  None
# re = get_operation("+")    #第一种用法,这就是一个函数
# print(re(10,20,30))
re = get_operation("*")(1,2,3)   #第二种用法,调用函数获取返回值,get_operation("*")(这是一个函数)
print(re)

re = get_operation("-")
print(re)#第一种用法,这就是一个函数
print(re(10,20,30))

2迭代器

1.什么是迭代器,可以存储多个数据

迭代器是python中的容器类数据类型,可以同时存储多个数据
取迭代器中的数据只能一个一个的取,而且取出来的数据,在迭代器中就不存在了。

2.迭代器中数据的来源

a.将其他序列中数据转换成迭代器
b.使用生成式、生成器取产生数据

3.将数据转换成迭代器

所有的序列都可以转换成迭代器

  • a将字符串转换成迭代器
    iter1 = iter("abcd")
    print(iter1)
  • b将列表串转换成迭代器
    iter2 = iter([1,2,3])
    print(iter2)
  • c将列表串转换成迭代器
    iter3 = iter({"name":"lorry","age":23})
    print(iter3)

2.获取迭代器中元素

  • a.next(迭代器) - 取出迭代器中第一个元素(取出来的元素再也放不回去了)
iter1 = iter("abcd")
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1)) #StopIteration当迭代器是空的时候没使用next获取元素, 出现StopIteration异常

iter1 = iter("abcd")
print(iter1.__next__())
print(next(iter1))
  • b.b.通过for 循环取出迭代器中元素
iter2 = iter([1,2,3])
print(iter2)
for x in iter2:
    print("===",x)

5.生成器

生成器就是迭代器,迭代器不一定生成器。
生成器就是带有yield的关键字函数的结果。
调用带有yield关键字的函数,拿到的结果就是生成器,生成器中的元素就是yield关键字后面的值。
只要函数中有yield的关键字,调用函数不会再执行函数体,而是创建一个生成器
只有在获取元素,使用next进行调取数据
当获取生成器元素的时候,才会执行函数的函数体,执行到yield语句为止,并且将yield后面的值,作为结果返回。
并且保存当前执行的位置。获取上一个元素的时候,就从上次结束的位置接着往下执行函数,知道函数结束或者遇到yield
如果函数结束了,就出现异常(stop)
生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生数据的个数。

next(func1) -》 调用func1对应的函数体将yield关键字后面的值作为结果。

#
def func1():
    print("abc")
    yield 100
    print("!!!!")
    yield 1000
re = func1()
print(next(re))
print(next(re))    #只能产生一次
def func2():
    for i in range(101):
        yield i
        print("next",i)
genger = func2()
print(next(genger))
print(next(genger))
print(next(genger))
def func4():
    i = 1
    while True:
        yield "stu"+str(i)
        i += 1
gener = func4()
# print(next(gener))
for x in range(100):
    print(next(gener))

练习 可以不断产生斐波那契数列

def func5(n):
    a = 1
    b = 1
    for i in range(n):
        c = a + b
        a,b = b,c
        yield c
gener1 = func5(100)
print(next(gener1))
print(next(gener1))
print(next(gener1))
print(next(gener1))
for x in range():
    print(next(gener1))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容