美文网首页
python笔记day9 - 函数2

python笔记day9 - 函数2

作者: w的狗子啊 | 来源:发表于2019-01-04 18:00 被阅读0次

    一、变量的作用域

    1、变量的作用域

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

    2、全局变量

    a.声明在函数或者类的外部的变量都是全局变量

    b.变量的作用域:从声明开始到整个py文件结束,任何位置都可以使用(作用域:从声明开始到文件结束)

    3、局部变量

    a.声明在函数或者类的内部的变量就是局部变量

    b.变量的作用域:从声明开始到函数结束,任何位置都可以使用

    4、golbal的使用

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

    作用:在函数内声明一个全局变量

    语法:

    golbal 变量名

    变量名 = 值

    5、nonlocal的使用  (用到的非常少,理解就行)

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

    作用:在局部的局部中修改局部变量的的值

    语法:

    nonlocal 变量名

    变量名 = 值

    """

    # 思考?

    funtions = []

    for xin range(5):

    def func1(a):

    return a*x

    funtions.append(func1)

    t1 = funtions[0]

    t2 = funtions[2]

    print(t1(2),t2(2))

    """

    二、函数作为变量

    python中,声明函数其实就是声明一个类型是function的变量。函数名就是变量名

    函数名作为变量除了可以用来调用函数获取返回值以外,普通变量能做的它都能做。

    """

    # 声明类型是int类型的值a

    a=10

    print(type(a))

    # 声明类型是dict类型的变量b

    b = {'a':12,'b':200}

    print(type(b))

    print(b['a'])

    # 声明类型是function类型的变量c

    c =lambda x: x*x

    print(type(c))

    c(10)

    # 声明类型是function类型的变量d

    def d(x):

    def e():

    print('abc')

    e()

    return x*x

    print(type(d))

    d(10)

    # 1、让一个变量给另外一个变量赋值

    #声明一个列表变量list1

    list1 = [1,2,3]

    # 使用列表变量list1给list2赋值

    list2=list1

    print(list2[0])

    # 声明一个函数变量func11

    def func11():

    print("我是函数")

    # 使用函数变量func11给ff赋值

    ff = func11

    # 将ff当成函数来用

    ff()

    # 2、将变量作为列表的元素或者是字典的值

    # 声明列表变量list1

    list1 = [1,2,3]

    # 将列表变量list1作为列表list2的元素

    list2 = [list1,100]

    print(list2[0][0])

    # 声明一个函数变量func2

    def func2():

    print("我是函数2")

    # 将函数变量func2作为列表list3的元素

    list3 = [func2,100]

    print(list3[0]())

    # 3、作为函数的参数

    # 将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)

    def test(x):

    print("text:",x)

    if not isinstance(x,int):

    x()

    # 声明一个int类型的变量a

    a =10

    # 将变量a作为test的实参

    test(a)

    def func3():

    print("我是函数3")

    test(func3)

    #3.1  sort函数

    """

    def sort(key=None,reverse=False)

    key - 确定排序的时候以什么值为标准来排序(默认的情况下,以列表的元素的大小为标准来排序)

    需要传一个函数,函数需要一个参数和一个返回值。这的参数是列表的元素

    reverse - 是否降序排序,需要穿一个bool值

    """

    def yt_sort(list1,key):

    if key ==None:

    for indexin range(len(list1)):

    for index2in range(index+1,len(list1)):

    current = list1[index]

    behind = list2[index2]

    if behind

    list1[index],list2[index2] = list2[index2],list1[index]

    else:

    for indexin range(len(list1)):

    for index2in range(index+1,len(list1)):

    current = key(list1[index])

    behind = key(list2[index2])

    if behind

    list1[index],list2[index2] = list2[index2],list1[index]

    my_list = [1,34,20,89,8]

    # yt_sort(my_list)

    # my_list.sort()

    print(my_list)

    my_list2 = [

    {'name':'张三','age':18},

    {'name':'李四','age':30},

    {'name':'王五','age':10}

    ]

    # my_list2.sort() # TypeError: '<' not supported between instances of 'dict' and 'dict'

    # yt_sort(my_list2) # TypeError: '<' not supported between instances of 'dict' and 'dict'

    def get_age(x):

    return x['age']

    yt_sort(my_list2, get_age)

    print(my_list2)

    my_list2 = [

    {'name':'张三','age':18,'score':90},

    {'name':'李四','age':30,'score':80},

    {'name':'王五','age':10,'score':89}

    ]

    # 取最大年龄对应的字典

    max_age =max(my_list2,key=lambda x: x['age'])

    print(max_age)

    # 取最大成绩对应的字典

    max_score =max(my_list2,key=lambda x: x['score'])

    print(max_score)

    # 4.变量作为函数的返回值

    # 返回值是函数的函数,也叫高阶函数(返回值高阶函数)

    def test2(n):

    sum1 =1

        for xin range(1, n+1):

    sum1 *= x

    return sum1

    re = test2(5) +10

    print(re)

    # =================================

    def get_operation(char):

    # char = '+'    (不能使用单行注释)

    """

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

        :paramchar: 运算符符号

        :return: 不同运算符对应的功能的函数

    """

        if char =='+':

    # 求和的功能

            def sum(*args, **kwargs):

    # args = (10,20,30)

    """求多个数的和"""

                sum1 =0

                for item1in args:

    sum1 += item1

    for keyin kwargs:

    sum1 += kwargs[key]

    print('yt')

    return sum1

    return sum

    elif char =='*':

    def mul(*args, **kwargs):

    sum1 =1

                for item1in args:

    sum1 *= item1

    for keyin kwargs:

    sum1 *= kwargs[key]

    return sum1

    return mul

    elif char =='-':

    def diff(*args):

    """求多个数的差"""

    # (10, 20, 30)

                sum1 = args[0]

    for indexin range(1,len(args)):

    sum1 -= args[index]

    return sum1

    return diff

    else:

    print('暂时不支持这个运算符')

    return None

    # re是一个函数

    re = get_operation('+')

    # re(10, 20, 30) - 调用函数获取返回值

    print(re(10,20,30))# 60  = 10+20+30

    # get_operation('*')  - 这个整体是一个函数

    # get_operation('*')(1, 2, 3)  - 调用求乘积的那个函数,并且获取返回值

    re = get_operation('*')(1,2,3)

    print(re)

    # 10 - 20 - 30

    print(get_operation('-')(100,20,30))

    """

    四、迭代器

    1、什么是迭代器(iter)

    迭代器是python中的容器类型数据,同时可以存储多个数据。

    取迭代器中的数据只能一个一个取,而且取出来的数据,在迭代器中就不存在

    2、迭代器中数据的来源

    a.将其他数据类型转换成迭代器

    b.使用生成式、生成器取产生数据

    3、将数据转换成迭代器

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

    """

    # 将字符串转换成迭代器

    iter1 =iter('abcd')

    print(iter1)

    iter2 =iter([1,10,100,1000])

    print(iter2)

    iter3 =iter({'name':'小明','age':20})

    print(iter3)

    """

    4、获取迭代器中的元素

    a.

    next(迭代器)/迭代器next() - 取出迭代器中第一个元素(已经去出来的元素再也会不到迭代器中了)

    """

    iter1 =iter('abcd')

    print(iter1)

    print(next(iter1))

    print(next(iter1))

    print(next(iter1))

    print(next(iter1))

    # print(next(iter1))  # 当迭代器是空的时候,使用next获取元素,会出现StopIteration异常

    print(iter2.__next__())

    print(next(iter2))

    # b.通过for循环取出迭代器中每个元素

    for xin iter2:

    print('==:', x)

    # print(next(iter2))  # 出现异常StopIteration,因为for循环已经将这个迭代器中的元素取完了

    """

    四、生成器

    1、什么是生成器

    迭代器就是生成器;迭代器不一定是生成器

    调用带有yield关键字的函数,拿到的结果就是一个生成器。生成器中元素就是yield关键字后面的值。

    2、生成器怎么产生数据

    只要函数种有yield关键字,调用函数不会再执行函数体获取返回值,而是创建一个生成器。

    当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,

    并且将yield后面的值作为结果返回;并且保存当前执行的位置。

    获取下一个元素的时候,就从上次结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止;

    如果遇到yield就将yield后面的值作为结果返回,并且保存当前执行的位置。

    如果函数结束了,就出现StopIteration异常。

    生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数

    相关文章

      网友评论

          本文标题:python笔记day9 - 函数2

          本文链接:https://www.haomeiwen.com/subject/kspkrqtx.html