• python学习笔记第三天


    • 函数的参数
    • 局部变量和全局变量
    • 递归函数和匿名函数
    • 高阶函数
    • 函数式编程了解
    • 作业

    一、函数的各种参数

    关键参数和位置参数:只要记住关键参数必须要放在位置参数后面就行了

    #参数问题
    def test(x,y,z):
        print(x)
        print(y)
        print(z)
    test(z=1,x=2,y=3)#2,3,1,关键参数顺序不受影响
    test(1,2,3)#1,2,3,位置参数顺序就是传入的顺序
    #test(1,y=2,4)#error,关键参数必须放在位置参数的后面
    test(1,z=2,y=2)
    

    非固定参数(可变参数?):*args,**kwargs

    #可变参数
    def test1(*args):#形参的数量不固定
        print(args)
    test1(1,2,3,4,5,)#实参放入元组中
    #结合位置参数
    def test2(x,*args):
        print(x)
        print(args)
    test2(1,2,3,4,5,6,7)
    #接受字典的可变参数---关键字参数
    def test3(**kwargs):
        print(kwargs)
    test3(name='sun',age='8',sex='M',tall="168")
    test3(name='sun')
    #组合使用
    def test4(name,**kwargs):
        print(name)
        print(kwargs)
    test4('sun')
    test4('sun',age=10)
    test4('sun',age=10,sex="m")
    
    def test5(name,age=10,**kwargs):
        print(name)
        print(age)
        print(kwargs)
    test5('sun',24,hobby='sleep')
    test5('sun',sex='m',age=3)#age=3的位置可以放在后面
    
    def test6(name,age=18,*args,**kwargs):
        print(name)
        print(age)
        print(args)
        print(kwargs)
    test6('sun',24,1,2,3,sex='m',hobby='sleep')#注意以下*args是如何传参的

    二、局部变量和全局变量

    针对数字、字符串这样的变量,在函数内部的参数的改变不会影响函数外面的全局变量的值

    #局部变量的问题
    name='SYR'
    def change_name(name):
        print('before change',name)
        name='syr'
        print('after change',name)
    change_name(name)
    print(name)
    

    执行结果:

    before change SYR
    after change syr
    SYR

    如果执意要在函数内部改变函数外的同名全局变量,可以在函数内部申明global

    school='CQPUT'
    def change(name):
        global school#在函数内就可以修改全局变量了
        school='cqput'
        print('before change',name,school)
        name='syr'
        print('after change',name)
    change(name)
    print('school',school)
    #局部变量前面加上global之后,就可以修改全局变量
    

    执行结果:

    before change SYR cqput
    after change syr
    school cqput

    可以看到shcool在内部改变了也会直接改变函数外面的那个school

    但是针对数组,字典等,函数内部的参数改变会直接折射到函数外

    #列表,集合,字典这些,在函数内部修改也会影响到全局变量
    names=['sun','yue','ru']
    def change_names():
        names[0]='孙'
        print(names)
    change_names()
    print(names)#namse被修改 了
    

    执行结果:

    ['孙', 'yue', 'ru']
    ['孙', 'yue', 'ru']

    三、递归函数和匿名函数

    递归函数的特性:

    1. 必须有一个明确的结束条件
    2. 每一次进入更深一次的递归,问题的规模都比上次减少
    3. 递归的效果很低,可能会导致栈溢出(函数的调用是通过栈实现)

    简单的递归示例:二分查找

    #Author:Yueru Sun
    def binary_search(dataset,find_num):
        print(dataset)
        if len(dataset)>1:
            mid=int(len(dataset)/2)
            if dataset[mid]==find_num:
                print('找到%d啦,在第%d位置'%(dataset[mid],mid))
            elif dataset[mid]>find_num:
                print('要查找的数字在%d的左边'%dataset[mid])
                return binary_search(dataset[0:mid],find_num)
            else:
                print('要查找的数字在%d的右边'%dataset[mid])
                return binary_search(dataset[mid+1:],find_num)
    
        else:
            if dataset[0]==find_num:
                print('找到数字')
            else:
                print('查找失败')
    # data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    binary_search([1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35],1)
    

    匿名函数:

    就是不需要显示的指定函数

    简单示例:

    #这段代码
    def calc(n):
        return n**n
    print(calc(10))
     
    #换成匿名函数
    calc = lambda n:n**n
    print(calc(10))
    

    结合map:

    res = map(lambda x:x**2,[1,5,7,4,8])
    for i in res:
        print(i)

    四、高阶函数

    高阶函数就是一个函数接收另外一个函数作为参数。

    简单示例:

    def add(x,y,f):
        return f(x) + f(y)
     
     
    res = add(3,-6,abs)
    print(res)
    

    常用的高阶函数之map:

    >>> def f(x):
    ...     return x * x
    ...
    >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    [1, 4, 9, 16, 25, 36, 49, 64, 81]

    常用的高阶函数之reduce:

    >>> def add(x, y):
    ...     return x + y
    ...
    >>> reduce(add, [1, 3, 5, 7, 9])
    25

    常用的高阶函数之filter:

    map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

    def is_odd(n):
        return n % 2 == 1
    filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
    # 结果: [1, 5, 9, 15]

    常用的高阶函数之sorted:

    sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    

      

    五、函数式编程

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000

    六、作业

    Python操作文件模拟SQL语句功能

    代码:

  • 相关阅读:
    Mac上搭建Hadoop环境(3) — Hive下载及安装
    Mac上搭建Hadoop环境(2) — Hadoop下载及安装
    Mac上搭建Hadoop环境(1) — 虚拟机的安装及SSH免密设置
    Mac上ssh localhost免密失败该如何解决
    Java8 Lambda 之 Collection Stream
    Java 集合Collection——初学者参考,高手慎入(未完待续)
    Java注解Annotation(一)
    ubuntu下安装和破解navicat的方法
    java I/O流类概述
    List元素为泛型时的注意事项
  • 原文地址:https://www.cnblogs.com/mesunyueru/p/8966727.html
Copyright © 2020-2023  润新知