美文网首页
day10-函数的应用

day10-函数的应用

作者: 丿Rem丶 | 来源:发表于2018-10-12 10:18 被阅读0次

    一、匿名函数

    1.基本知识

    • 字面量:
      函数名 = lambda 参数列表:返回值

    • 说明:

      • 函数名 -> 变量名

      • lambda -> 关键字

      • 参数列表 -> 参数名1, 参数名2...

      • : -> 固定的

      • 返回值 -> 相当于只有一个return语句的函数体

    • 例子:

    sum1 = lambda num1=10, num2=3: num1+num2
    
    print(sum1(10, 20))
    print(sum1(num1=100, num2=200))
    print(sum1())
    
    sum11 = lambda *nums: sum(nums)
    print(sum11(1, 2, 3))
    #30
    #300
    #13
    #6
    

    2.应用

    • 读程序:
    funcs = []
    for item in range(1, 5):
        funcs.append(lambda x: x*item)
    print(item)
    
    """
    item = 1 ~ 4
    item = 1  [lambda x: x*item]
    item = 2  [lambda x: x*item, lambda x: x*item]
    item = 3  [lambda x: x*item, lambda x: x*item, lambda x: x*item]
    item = 4  [lambda x: x*item, lambda x: x*item, lambda x: x*item, lambda x: x*item]
    """
    print(funcs[0](2))  # 2*4   8
    print(funcs[1](2))  # 2*4   8
    
    

    二、变量作用域

    1.作用域

    • 定义:
      变量的作用域指的是变量能够使用的范围

    2.全局变量

    • 定义:
      声明在函数和类的外面的变量都是全局变量

    • 作用域:
      作用域是从声明开始,到整个py文件结束(任何地方都可以使用)

    • 例子:

    a = 10
    
    # x和b都是全局变量
    for x in range(5):
        b = 10
        print(x)
    
    

    3.局部变量

    • 定义:声明在函数和类中的变量都是局部变量

    • 作用域:声明在函数的局部变量,作用域是从声明开始到整个函数结束

    • 例子:

    def fun1():
        # 局部变量
        aa = 100
        print(aa, a1)
        for xx in range(5):
            print(aa+xx)
    
    

    4.global关键字

    • 定义:
      在函数中说明一个变量是全局变量

    • 注意:
      只能在函数中使用

    • 例子:

    name = 'abc'
    
    
    def func2():
        global age
        age = 18
    
        global name    # 说明当前函数中使用的name是全局变量name
        name = 'aaa'
        print(name)
    
    
    
    func2()
    print(name)
    print(age)
    
    #aaa
    #aaa
    #18
    

    5.nonlocal关键字

    • 用法:
      想要在局部的局部中修改局部变量的值

    • 例子:

    def func3():
        abc = 100
        def func4():
            nonlocal abc
            abc = 200
            print('f4:', abc)
        func4()
        print('f3:', abc)
    
    func3()
    #f4: 200
    #f3: 200
    

    三、函数做变量

    1.定义

    • 声明函数就是声明一个类型是function的变量, 函数名实质就是变量名。

    2.作用

    • a.给其他变量赋值
    def func11():
        print('我是函数')
    # 用一个函数给变量a赋值,a也是一个函数
    a = func11
    a()
    print(a)
    #我是函数
    #<function func11 at 0x0000024629456048>
    
    • b.作为列表的元素
    def func22():
        print('我又是函数')
        return 10
    
    list2 = [1, func22, func22()]
    print(list2)
    
    # list2[1]取到一个函数, 通过后面加()调用函数
    print(list2[1]())
    
    # list2[2]取到的是整数10
    print(list2[2]+100)
    
    #[1, 10] 110
    #我又是函数
    #[1, <function func22 at 0x000002462B11FAE8>, 10]
    #我又是函数
    #10
    #110
    
    • c.将函数作为参数
    list2 = [
        {'name': '张三', 'age': 20, 'score': 90},
        {'name': '李四', 'age': 28, 'score': 70},
        {'name': '王五', 'age': 18, 'score': 89}
    ]
    # 根据成绩排序
    # def get_age(item):
    #     return item['score']
    # list2.sort(key=get_age)
    list2.sort(key=lambda item: item['score'])
    print(list2)
    #[{'name': '李四', 'age': 28, 'score': 70}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '张三', 'age': 20, 'score': 90}]
    
    list3 = [
        ('a', 20),
        (10, 3),
        ('b', 90)
    ]
    # def second(item):
    #     return item[1]
    # list3.sort(key=second, reverse=True)
    # print(list3)
    
    list3.sort(key=lambda item: item[1])
    print(list3)
    #[(10, 3), ('a', 20), ('b', 90)]
    

    四、函数调用在内存中的影响

    1.定义

    • 函数的调用过程是一个压栈的过程,每次调用函数的时候,系统都会在内存中(栈)开辟空间来存储函数执行过程中产生数据(函数中声明的变量)。当函数调用完成后,这块内存会自动销毁。

    五、递归函数

    1.基本知识

    • 定义:
      递归函数:函数中调用函数本身,这样的函数就是递归函数(自己调自己)

    • 注意:循环能做的事情递归都可以做,但是实际上循环能解决的问题绝对不选递归

    2.递归函数的声明

    • 声明步骤:

      • 第一步:确定临界值(循环结束的条件), 让函数结束

      • 第二步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系

      • 第三步:根据关系,用f(n-1)实现f(n)的功能

    • 例子:

    """
    yt_sum(5)  n=5  5!=1   return yt_sum(4)+5
    yt_sum(4)  n=4  4!=1   return yt_sum(3) + 4
    yt_sum(3)  n=3  3!=1   return yt_sum(2) + 3
    yt_sum(2)  n=2  2!=1   return yt_sum(1) + 2
    yt_sum(1)  n=1  1==1   return 1
    """
    # 写一个递归函数,实现:1+2+3+...n
    def yt_sum(n):
        # 1.找临界值
        if n == 1:
            return 1
    
        # 2.找关系
        """
        yt_sum(n) = 1+2+3+...+n
        yt_sum(n-1) = 1+2+3+...+n-1
        yt_sum(n) = yt_sum(n-1)+n
        """
        # 3.用f(n-1)实现f(n)的功能
        return yt_sum(n-1) + n
    
    
    print(yt_sum(5))
    #15
    

    作业

    1. 写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表自带的逆序函数)
    ljk_reverse = lambda  list1: list1[::-1]
    print(ljk_reverse([1,2,3]))
    #[3, 2, 1]
    
    1. 写一个函数,提取出字符串中所有奇数位上的字符
    ljk_odd = lambda  str1: str1[1::2]
    print(ljk_odd('ljkhhh'))
    #jhh
    
    1. 写一个匿名函数,判断指定的年是否是闰年
    def ljk_bissextile_year(year:int):
    
        if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
            print('是闰年')
        else:
            print('不是闰年')
    ljk_bissextile_year(1800)
    ljk_bissextile_year(2000)
    #不是闰年
    #是闰年
    
    1. 使用递归打印:
    n = 3的时候   
       @    
      @@@  
     @@@@@ 
     
    n = 4的时候: 
        @
       @@@
      @@@@@
     @@@@@@@
    
    
    x = 0
    def print_star(n):
        global x
        x += 1
        if n == 1:
            print((x-n)*' '+'@'+(x-n)*' ')
            return
        print_star(n-1)
        m =  2 * n - 1
        print((x-n)*' '+'@' * m+(x-n)*' ')
    print_star(4)
    
    #   @   
    #  @@@  
    # @@@@@ 
    #@@@@@@@
    
    1. 写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。
    def ljk_seq(n = 10):
        if n ==1 or n ==2:
            return 1
        return ljk_seq (n-1) +  ljk_seq(n-2)
    print(ljk_seq())
    #55
    
    1. 写一个函数,获取列表中的成绩的平均值,和最高分
    def ljk_score(list1:list):
        list1.sort()
        print('最高分:',list1[-1])
        count = 0
        for x in list1:
            count += x
        print('平均值:',count/len(list1))
    ljk_score([18,54,77,22,99,23,100,66])
    #最高分: 100
    #平均值: 57.375
    
    1. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新的列表返回给调用者
    def ljk_check(data1):
        list1 = []
        for x in data1[1::2]:
            list1.append(x)
        return list1
    print(ljk_check((1, 2, 3, 4, 5)))
    #[2, 4]
    
    1. 实现属于自己的字典update方法:用一个字典去更新另一个字典的元素(不能使用自带的update方法)
      yt_update(字典1, 字典2)
    def ljk_update(dict1:dict,dict2:dict):
        for key in dict2:
            dict1[key]=dict2[key]
        return dict1
    dict1={"name":"哈哈哈","age":22}
    dict2={"age": 15,"school":"清华"}
    print(ljk_update(dict1,dict2))
    #{'name': '哈哈哈', 'age': 15, 'school': '清华'}
    
    1. 实现属于自己的items方法:将字典转换成列表,字典中的键值对转换成元祖。(不能使用items方法)
      yt_items(字典)
      例如:{'a': 1, 'b':2, 'c':3} ---> [('a', 1), ('b', 2), ('c', 3)]
    def ljk_items(dict1:dict):
        list1=[]
        for key in dict1:
            x=(key,dict1[key])
            list1.append(x)
        return list1
    print(ljk_items({"name":"哈哈哈","age":22}))
    #[('name', '哈哈哈'), ('age', 22)]
    

    相关文章

      网友评论

          本文标题:day10-函数的应用

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