zoukankan      html  css  js  c++  java
  • Python开发——5.函数

    一、函数的定义

    def test(x)
        "The Function definitions"
        x += 1
        return x

    def:定义函数的关键字

    test:函数名

    ():定义形参

    “”:文档描述

    x += 1:泛指代码块或程序处理逻辑

    return:定义返回值(出现return,函数结束)

    调用运行时,可带参数也可不带:函数()

    优点:代码重用,保持一致性易维护,可扩展性

    二、函数和过程

    1.过程即没有返回值的函数,由于Python中没有使用return返回值时,会返回None,所以过程在Python中也是函数

    2.返回值

    def test01():
        pass
    def test02():
        return 0
    def test03():
        return 0, 10, 'hello', ['kobe', 'lbj'], {'Team': 'lakers'}
    t1 = test01()
    t2 = test02()
    t3 = test03()
    print(t1,t2,t3)

    返回值数为0,返回None,返回值数为1,返回object,返回值数>1,返回tuple。

    三、函数参数

    1.形参和实参

    def calc(x,y):#x,y为形参
        res = x ** y
        return res
    t = calc(1,2)#1,2为实参
    print(t)

      形参只在函数调用时才分配内存单元,调用结束后立即释放,因此形参只在函数内部有效

      实参可以是常量、变量、表达式、函数,在函数调用时,实在必须有确定的值以便把值传给形参

    2.位置参数和关键字参数

    def test(x,y,z):
        print(x,y,z)
    test(1,2,3)#位置参数
    test(x=1,z=3,y=2)#关键字参数
    test(1,y=2,z=3)

      位置参数必须一一对应,不能多或少,关键字参数无须一一对应,也不能多或少,二者可以混用,但位置参数必须在关键字参数左边否则报错。

    3.默认参数

    def power(x, n=2):#n为默认参数
        s = 1
        while n > 0:
            n = n - 1
            s = s * x
        print(s)
        return(s)
    
    power(4,4)

      默认参数可以降低函数调用的难度,但设置的时候要注意,不能用可变对象

    def add_end(L=[]):
        L.append('END')
        return L
    
    # print(add_end([123,456]))
    print(add_end())
    print(add_end())
    print(add_end())

    4.参数组

    def test(x,*args,**kwargs):
        print(x)
        print(args)
        print(kwargs)
    test(1,2,3,4,5,y=12,z=22)

      *args传的是列表或元组,**kwargs传的是字典

    (1)定义可变参数用*

    def calc(*numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum
    s = calc(1,2,3)
    print(s)
    num = [1,2,3,4]
    s = calc(*num)
    print(s)

    (2)定义关键字参数用**

    def person(name, age, **kw):
        print("name:", name, "age:", age, "other:", kw)
    person("hechouzi", 25,city="jiangsu",height=183)
    extra = {"city":"jiangsu","height":183}
    person("heheh",12,**extra)

    四、全局变量和局部变量

      全局变量全部大写,局部变量全部小写

      函数中如果没有global参数,且没有声明局部变量,函数内部可以调用全局变量,但不可修改

      函数中如果有global参数,可以对全局变量进行修改

      函数中如果定义了局部变量,则优先读取局部变量

    NAME = "KOBE"
    def change_name():
        global NAME
        name = "LBJ"
        print("Who am i:",NAME)
        print("Who are you:",name)
        NAME = "BYRANT"
        print("Now,who am i:",NAME)
        print("Now,who are you:",name)
    change_name()
    print(NAME)
    print(name)#报错,因为是局部变量

    五、前向引用

      “函数即变量”

    def test1():
        print("from test1")
        test2()
    def test2():
        print("from test2")
    test1()

    前向引用就是在定义函数之前引用

    六、嵌套函数和作用域

    def test1():
        name = "Jordan"
    
        def test2():
            name = "Kobe"
    
            def test3():
    
                print(name)
            return test3
    
        return test2
    func = test1
    print(func)
    func()()()

    七、递归调用

    1.递归特性

      1.必须有一个明确的结束条件;2.进入深一层的递归,问题规模要比上一层有所减少;3.递归效率不高,递归层次过高会导致栈溢出。

    (图侵删)

    def calc(n):
        if int(n/2)==0:
            return n
        n = int(n/2)
        re = calc(n)
        return re
    print(calc(100))

    2.尾递归优化

      如阶乘函数,当所求阶乘数太大,会导致栈溢出。

    def fact(n):
        if n == 1:
            return n
        return n*fact(n-1)
    print(fact(100))

      尾调用就是指在一个函数的最后一步调用另外一个函数,以此来实现尾递归优化

    def fact(n):
        return fact_iter(n,1);
    def fact_iter(num,res):
        if num == 1:
            return res
        return fact_iter(num - 1,num*res)
    print(fact(5))

      尾调用优化可以不要保存外层函数的调用记录,可以防止栈溢出,但大多数编程语言没有针对尾调用优化,Python也没有。

    八、匿名函数

    calc = lambda n:n**n
    print(calc(10))

      匿名函数lambda主要和其他函数搭配使用

    九、函数式编程

    1.函数式编程

      函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

    函数式编程的一个特点是允许把函数本身作为参数传给另一个函数,还允许返回一个函数,因为Python允许使用变量,所以Python不是纯函数式编程语言。

    2.高阶函数

      可以接收另外一个函数做变量的函数

    def add(x,y,f):
        return (f(x)+f(y))
    print(add(-1,6,abs))

      高阶函数满足两个特性:(1)传入参数是一个函数名;(2)返回值是一个函数名

    3.map函数和reduce函数

    (1)map函数

      接收两个参数,一个是函数,一个是可迭代对象

    def f(x):
        return x*x
    print(list(map(f,[1,2,3,4,5])))
    L = []
    for i in [1,2,3,4,5]:
        L.append(i*i)
    print(L)

      相同功能可以用for实现,但map函数把运算规则抽象了,可以计算任意复杂函数。

      map函数结合匿名函数的使用

    print(list(map(lambda x:x*x,range(5))))

    (2)reduce函数

      把一个函数作用到一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积运算。

    from functools import reduce
    def f(x,y):
        return x*100+y*10
    print(reduce(f,[1,2,3,4,5]))

    4.filter函数

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

    def is_odd(x):
        return x % 2 == 1
    print(list(filter(is_odd,[1,2,3,4,5,6,7,8])))

    十、内置函数

     https://docs.python.org/3/library/functions.html?highlight=built#ascii 

    1.abs()  

      取绝对值

    2.all() 

      把所有元素做bool运算,如果都是True则返回True

    3.any()  

      把所有元素做bool运算,只要有一个是True就返回True

    4.bin()/hex()/oct()

    把十进制数转换成二进制/十六进制/八进制数

    5.bool()  

      判断bool值

    6.bytes()  

      把字符串转换成字节,需指定编码

    #bytes()函数
    a = bytes('abc', 'utf-8')
    print(a)
    b  = bytes(1)
    print(b)
    c = bytes([2,3,6,8])
    print(c)

    7.chr()/ord()  

      chr(),输入ASCII码表中的编号,输出对应字符;ord(),输入字符,显示字符对应的ASCII码表中的编号

    8.dir()  

      打印某个对象下的方法

    9.divmod()  

      取得商和余数,可以用在分页功能

    10.enumerate()  

      遍历序列中的元素及下标

    test = [11,22,33,44]
    for i,j in enumerate(test):
        print(i,j)

    11.eval()  

      将字符串str当成有效的表达式来求值并返回计算结果;把字符串中的数据结构提取出来

    12.zip()  

      拉链

    a = (1,2,3)
    b = ("a","b","c")
    print(list(zip(a,b))

    13.max()/min()  

      求取最大值和最小值

    14.pow()  

      输入两个参数是求取次幂,输入三个参数是求次幂后取余

    15.reversed()    

      反转

    16.round()  

      四舍五入 ,可以指定小数位

    17.sorted()  

      排序

    18.sum()  

      求和

    19.type()  

      查看类型

    20.__import__()  

      导入文件

     

  • 相关阅读:
    Java文件读取
    Java继承
    JAVA程序提示错误:需要class,interface或enum解决方法
    SQL 修改列名
    转 父表字表统计查询的sql练习
    powerdesigner12.5入门教程
    现实世界
    oracle添加联合主键
    hashtable的用法
    JQ 1
  • 原文地址:https://www.cnblogs.com/hechengwei/p/8934069.html
Copyright © 2011-2022 走看看