• python函数


    一、函数:

    创建函数:使用def语句

    举例:定义一个返回斐波那楔数列列表的函数

    def fibs(num):
        result = [0,1]
        for i in range(num-2):
            result.append(result[-2]+result[-1])
        print(result)
    fibs(10)

    >>>
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    >>>

     文档化函数:对函数进行说明,写在函数开头的字符串,它会作为函数的一部分进行存储,称为文档字符串。

    举例:给square()函数进行注释

    def square(x):
        '''calculates the square of the nmber x'''
        return x*x
    
    #使用此方法访问:
    >>> square.__doc__ 'calculates the square of the nmber x' >>>

     return语句:函数的返回值,起到结束函数的作用,不需要返回时,返回为None

    举例:

    def test():
        print('pass')
        return
        print('nothing')
    x = test()
    print(x)
    
    >>> 
    pass
    None
    >>> 

     参数:

    形参:函数名后面的变量通常叫做函数的形参;

    实参:调用函数时提供的值称为实参;

    说明:在函数内为参数赋值新值不会改变外部任何变量的值;

    举例:

    #不可变参数:字符串、数字和元组
    def change(n):
        n = 'zyj'
        print(n)
        
    name = 'sl'
    change(name)
    print(name)
    >>> 
    zyj
    sl
    >>>
    
    #可变参数如列表
    def change(n):
    n[0] = 'zyj'
    print(n[0])
    
    name = ['sl','xm']
    change(name)
    print(name)
    
    >>> 
    zyj
    ['zyj', 'xm']
    >>>
    
    # 保留原始变量的办法:
    def change(n):
    n[0] = 'zyj'
    print(n[0])
    
    name = ['sl','xm']
    change(name[:])
    print(name)
    
    zyj
    ['sl', 'xm']
    >>>

    使用函数改变数据结构的实现举例

    要求:编写一个存储名字,并且能根据条件查找对应的名字

    实现:定义数据结构类型为字典,通过键值(first,second)查找对应的name。

    def init(data):
        '''初始化数据结构的函数'''
        data['first'] = {}
        data['second'] = {}
    def lookup(data,lable,name):
        '''查找人名相同函数'''
        return data[lable].get(name)
    def store(data,full_name):
        '''将输入名字存储在数据库中函数'''
        names = full_name.split()
        if len(names) == 1:
            names.insert(1, '')
        labels = 'first','second'
        for label,name in zip(labels,names):
            peole = lookup(data,label,name)
            if peole:
                peole.append(full_name)
            else:
                data[label][name]=[full_name]
    
    >>> storage = {}
    >>> init(storage)
    >>> storage
    {'first': {}, 'second': {}}
    >>> store(storage, 'zhao yujiao')
    >>> lookup(storage,'second','yujiao')
    ['zhao yujiao']
    >>> store(storage, 'zhao qiaojiao')
    >>> lookup(storage,'second','yujiao')
    ['zhao yujiao']
    >>> storage
    {'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao']}, 'second': {'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao']}}
    >>> lookup(storage,'first','yujiao')
    >>> lookup(storage,'first','zhao')
    ['zhao yujiao', 'zhao qiaojiao']
    >>> store(storage, 'song qiaojiao')
    >>> storage
    {'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao'], 'song': ['song qiaojiao']}, 'second': {'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao', 'song qiaojiao']}}
    >>> lookup(storage,'second','qiaojiao')
    ['zhao qiaojiao', 'song qiaojiao']
    >>> store(storage, 'qiaojiao')
    >>> storage
    {'first': {'zhao': ['zhao yujiao', 'zhao qiaojiao'], 'qiaojiao': ['qiaojiao'], 'song': ['song qiaojiao']}, 'second': {'': ['qiaojiao'], 'yujiao': ['zhao yujiao'], 'qiaojiao': ['zhao qiaojiao', 'song qiaojiao']}}

     关键字参数:可以明确每个参数的作用,不需要在乎参数的位置。

    def hello_1(greeting,name):
        print("%s,%s!" % (greeting,name))
    def hello_2(name,greeting):
        print("%s,%s!" % (name,greeting))
    hello_1("Hello","World")
    hello_1(greeting="Hello",name="World")
    >>> 
    Hello,World!
    Hello,World!
    >>>

    关键字参数可以在函数中给参数提供默认值,此时调用的时候可以不用提供参数,提供一些或提供所有参数

    def hello_3(greeting="Hello",name="World"):
        print("%s,%s!" % (greeting,name))
    hello_3()
    hello_3("greetings")
    hello_3("greetings",'zyj')
    hello_3(name='zyj')
    >>> 
    Hello,World!
    greetings,World!
    greetings,zyj!
    Hello,zyj!
    >>> 

    位置参数和关键字参数结合使用

    def hello_3(name,greeting="Hello",p='!'):
        print("%s,%s%s" % (greeting,name,p))
    hello_3("zyj")
    hello_3("zyj",p='!!!')
    hello_3(name='zyj')
    >>> 
    Hello,zyj!
    Hello,zyj!!!
    Hello,zyj!
    >>> 

    收集参数:参数前加星号将所有值放置在同一个元组中。一个参数里面传递多个值。

    def print_params(*params):
        print(params)
    print_params('zyj')
    print_params(1,2,3)
    print_params([1],[2],[3])
    print_params((1,2),(2,3))
    def print_params(title,*params):
        print(title)
        print(params)
    print_params('name:','zyj','sl','sb')
    print_params('name:')
    >>> 
    ('zyj',)
    (1, 2, 3)
    ([1], [2], [3])
    ((1, 2), (2, 3))
    name:
    ('zyj', 'sl', 'sb')
    name:
    ()
    >>> 

    收集关键字参数:使用**,返回的是字典

    def print_params(**params):
        print(params)
    print_params(x=1,y=2,z=3)
    print_params(x=[1],y=[2],z=[3])
    print_params(x=(1,2),y=(2,3))
    def print_params(x,y,z=9,*params,**key):
        print(x,y,z)
        print(params)
        print(key)
    print_params(1,2,3,4,5,6,foo=1,bar=2)
    print_params(1,2)
    >>> 
    {'x': 1, 'y': 2, 'z': 3}
    {'x': [1], 'y': [2], 'z': [3]}
    {'x': (1, 2), 'y': (2, 3)}
    1 2 3
    (4, 5, 6)
    {'foo': 1, 'bar': 2}
    1 2 9
    ()
    {}
    >>> 

     参数收集的逆过程:在定义或者调用参数时使用星号或者双星号传递元组或字典。

    def add(x,y):
        return x+y
    params = (1,2)
    
    def hello_3(name,greeting="Hello",p='!'):
        print("%s,%s%s" % (greeting,name,p))
    params = {'name':"zyj"}
    
    >>> add(*params)
    3
    >>> hello_3(**params)
    Hello,zyj!
    >>> 

    作用域:

    1、局部变量:函数内部的变量

    2、全局变量:具有全局作用域的变量

    def foo():
        x = 42
    x = 1
    foo()
    >>> x
    1
    >>>   

    当局部变量或者参数的名字和要访问的全局变量名相同时,不能直接访问全局变量,因为全局变量将被局部变量屏蔽

    解决办法:使用globals()函数获取全局变量

    vars():返回全局变量的字典;

    locals():返回局部变量的字典

    def combine(params):
        print(params+params)
    params = 'zyj'
    combine('hello')
    def combine(params):
        print(params+globals()['params'])
    params = 'zyj'
    combine('hello')
    >>> 
    hellohello
    hellozyj
    >>> 

    如何改变全局变量的值:

    x = 1
    def change_global():
        global x
        x = x + 1
    change_global()
    >>> x
    2
    >>> 

    函数的嵌套:一般用于需要用一个函数创建另一个的时候;

    说明:一个函数位于另一个里面,外层函数返回里层函数,函数本身被返回,但并没有被调用,同时返回的函数可以访问它的定义所在的作用域,来自外部作用域的变量会被内层函数访问。

    类似 multiplyByFactor函数存储子封闭作用域的行为叫做闭包。

    def multiplier(factor):
        def multiplyByFactor(number):
            return number*factor
        return multiplyByFactor
    >>> double = multiplier(2)
    >>> double(5)
    10
    >>> triple = multiplier(3)
    >>> triple(3)
    9
    >>> multiplier(5)(4)
    20
    >>> 

     递归:调用自身即函数可以调用自身

    无穷递归:会导致程序崩溃或最终返回“超过最大递归深度”的错误信息提示

    def foo():
        return foo()
    >>> foo()
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        foo()
      File "C:Users七彩蜗牛Desktop抽象.py", line 2, in foo
        return foo()
      File "C:Users七彩蜗牛Desktop抽象.py", line 2, in foo
        return foo()
        ......
    RuntimeError: maximum recursion depth exceeded
    >>> 

    有用的递归:递归实例,包括一个或多个问题较小部分的递归调用

    使用递归实现阶乘:函数调用了fact(n)和fact(n-1)两个不同的实体。

    def factorial(n):
        result = n
        for i in range(1,n):
            result *= i
        return result
    
    def fact(n):
        if n == 1:
            return 1
        else:
            return n * fact(n-1)
    >>> factorial(10)
    3628800
    >>> fact(10)
    3628800
    >>> 

     使用递归实现幂:函数调用了p(x,n)和p(x,n-1)两个不同的实体。

    def power(x,n):
        result = 1
        for i in range(n):
            result *= x
        return result
    def p(x,n):
        if n == 0:
            return 1
        else:
            return x * p(x,n-1)
    >>> 
    >>> power(2,3)
    8
    >>> p(2,3)
    8
    >>> power(3,0)
    1
    >>> p(3,0)
    1
    >>> 

     函数属性:

    命名空间:使用句点属性标识创建不同的名字空间领域。句点属性标识对于两个模块意味不同的命名空间

    def foo():
        ''' foo()---properly created doc string '''
    def bar():
        pass
    bar.__doc__ = 'hello'
    bar.version = 0.1
    >>> 
    >>> help(foo)
    Help on function foo in module __main__:
    
    foo()
        foo()---properly created doc string
    
    >>> foo()
    >>> print(foo())
    None
    >>> print(bar.version)
    0.1
    >>> print(bar.__doc__)
    hello
    >>> help(bar)
    Help on function bar in module __main__:
    
    bar()
        hello
    
    >>> bar.__doc__
    'hello'
    >>> bar.__dict__
    {'version': 0.1}
    >>> foo.__dict__
    {}
    >>> 
  • 相关阅读:
    C#与C++与互操作
    WPF GridView动态添加项并读取数据
    C#使用消息队列(MSMQ)
    使用代码浏览WPF控件模版
    PowerShell将运行结果保存为文件
    opencv + ffmpeg
    vmware
    HttpComponents Downloads
    pytorch 安装
    opencv 3.4.0 的编译
  • 原文地址:https://www.cnblogs.com/zhaoyujiao/p/5252056.html
Copyright © 2020-2023  润新知