zoukankan      html  css  js  c++  java
  • Python函数

    函数的定义:

    编程中的函数是用最基础的指令来实现比较复杂的功能,在此期间可以把该过程中的众多子程序封装成另一个高一级的“指令”,我们可以给这个“指令”起一个名字,方便在以后调用.这个过程可以无限的抽象循环,创造更高一级的“指令”.

    另外重要的一点,函数即变量

    使用函数的好处

    1. 把经常使用的功能封装,减少代码量

    2. 便于统一维护和修改

    3. 具有更加良好的可扩展性

    函数与过程的区别

    过程就是没有返回值的函数,但是在Python里面如果没有返回值的话,就会自动返回None.因此严格来说,在Python里面只有函数,而没有过程.

    当return值的数量为0时,返回None;数量为1时,返回object;数量大于1时,返回tuple类型

    函数

     1 >>>def 函数名(形参):
     2 >>>    """      注释      """
     3 >>>    [指令过程]
     4 >>>    return  ##也可以不用return
     5 
     6 ##########可以在函数里面添加默认的参数##########
     7 #在执行的过程中,没有传入参数覆盖默认的参数设置,就返回默认的值
     8 >>>def 函数名(形参, 形参 = 某值):    ##默认形参必须放在参数群的最后面
     9 >>>    """      注释      """
    10 >>>    [指令过程]
    11 >>>    return  ##也可以不用return

    位置参数和关键字参数

    >>>def 函数名(形参):
    >>>    """      注释      """
    >>>    [指令过程]
    >>>    return res
    
    #####调用#####
    #####位置参数
    >>>def 函数名(实参,实参,实参) 
    
    #####关键字参数
    >>>def 函数名(关键字 = 值,关键字 = 值)
    
    #####位置参数与关键字参数混用
    >>>def 函数名(实参,关键字 = 值,关键字 = 值)  ##实参必须在关键字参数的前面

    接收多个参数

    >>>def 函数名(形参,*args,**kwargs):
    >>>    """      注释      """
    >>>    [指令过程]
    >>>    return res
    
    ##  其中*args表示接收多余的位置参数,**kwargs表示接收多余的关键字参数,但是不能重复传值

    嵌套函数和作用域,局部变量与全局变量

    局部变量即指只能在局部被调用变量,即在函数内部被定义的变量,这种变量只能被该一级的函数或低级的子程序调用.

    全局变量即指能在任何一级都能被调用的,这种变量基本都是函数外面被定义的.

    函数的封装可以函数里面再调用函数,外面的变量也可以被里面的使用,但是里面的变量却不能被外面所调用.如果在这一级找不到所对应的变量,那么就会不断地自动到外面去找对应的变量,直到找到相关的变量为止.如果要把里面封装的变量作为全局变量,即在任何地方都能被调用的话,就可以使用如下方法:

    1 >>>def func():
    2 >>>   ………………
    3 >>>    def func():
    4 >>>    global 变量名    ##这样之后,变量就会变成全局变量
    5 >>>    变量名 =6 >>>    nonlocal 变量名
    7 >>>    变量名 = 值      ##变量替代上一级的变量

    作用域在定义函数时就已经固定住了,本身不会随着调用位置的改变而改变

     1 >>> def test():
     2     print("Good morning!"    
     3 >>> def test1():
     4     return test
     5 >>> bar = test1()    ##获得函数test()的内存地址
     6 >>> bar()            ##运行test()
     7 Good morning!
     8 
     9 >>> name = "YuanMing"
    10 >>> def func1():
    11     name = "Hermaeus"
    12     def func2():
    13         name = "Duke_Yuan"
    14         def func3():
    15             print(name)
    16         return func3
    17     return func2
    18 #####执行方式一
    19 >>> test1 = func1
    20 >>> test1 = func1()
    21 >>> test2 = test1()
    22 >>> test2()
    23 Duke_Yuan   ##随着定义域不断向上级找变量
    24 #####执行方式二
    25 >>> func1()()()
    26 Duke_Yuan

    递归函数

    在嵌套函数中,可以对函数自身无限再调用,而构成了一个无限调用的过程,这种函数被称之为递归函数.但是递归函数必须满足以下条件:

    • 必须有一个明确的结束条件

    • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    • 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

     1 >>> def calc(n):
     2     if n == 10:
     3         return n
     4     print(n)
     5     calc(n+1)    
     6 >>> calc(0)
     7 0
     8 1
     9 2
    10 3
    11 4
    12 5
    13 6
    14 7
    15 8
    16 9

    匿名函数

     1 >>>lambda 形参:[表达式]
     2 ##########该匿名函数表示
     3 >>>def 函数名():
     4 >>>    return 表达式
     5 
     6 ##########调用 
     7 >>> func = lambda x,y:x*y
     8 >>> func(1,2)
     9 2
    10 
    11 ##########要返回多个值
    12 >>> func = lambda x, y, z:(x+1, y+1, z+1)  ##必须要加括号
    13 >>> func(1,2,3)
    14 (2, 3, 4)

    函数式编程

    高阶函数

    满足下面两个任意条件之一的都叫做“高阶函数”:

    1. 函数的传入参数是一个函数名

    2. 函数的返回值是一个函数名

    map()函数 map(func, *iterables) 

    处理序列里面每一个值,返回迭代器

    1 >>> test = [1, 2, 3, 4, 5, 6]
    2 >>> print(list(map(lambda x:x**2, test)))
    3 [1, 4, 9, 16, 25, 36]

    filter()函数 filter(function or None, iterable) 

    判断筛序列里面的元素,如果是True就保留,返回迭代器

    1 >>> lis = ["ADC", "AD", "ad", "ae"]
    2 >>> print(list(filter(lambda n:n.startswith("A"), lis)))
    3 ['ADC', 'AD']
    4 >>> print(list(filter(lambda n:n.isupper(), lis)))
    5 ['ADC', 'AD']
    6 >>> print(list(filter(lambda n:n.islower(), lis)))
    7 ['ad', 'ae']

    reduce()函数 reduce(function, sequence[, initial]) 

    在Python 3里已经把reduce方法放入functools工具包里面了,整体处理列表里面的值,如让所有元素相加相乘,返回值

    1 >>> from functools import reduce
    2 >>> lis = [1,2,3,4,5]
    3 >>> print(reduce(lambda x,y:x*y, lis, 10))
    4 1200

    内置函数

    [官方解释链接]

     abs(x ) 

    返回数字的绝对值.参数可以是整数或浮点数。如果参数是复数,则返回其大小.

    1 >>> abs(-1)
    2 1
    3 >>> abs(-12)
    4 12

     all(iterable) 

    返回True如果的所有元素迭代是真的(或者如果可迭代为空),为False的有0,空,None

    1 >>> print(all([0, [], 1]))
    2 False
    3 >>> print(all([1, 2, 3]))
    4 True

     any(iterable) 

    返回True如果iterable的任何一个元素为bool时是True。如果iterable为空,则返回False

    1 >>> print(any([0, None, []]))
    2 False
    3 >>> print(any([1, 0, None]))
    4 True

     ascii(object) 

     bin(x ) 

    将整数转换为前缀为“0b”的二进制字符串

    1 >>> bin(3)
    2 '0b11'
    3 >>> bin(-10)
    4 '-0b1010

     bool(x) 

    返回bool值,如果为0,空,None则为False

    1 >>> bool(0)
    2 False
    3 >>> bool(None)
    4 False
    5 >>> bool([])
    6 False
    7 >>> bool(12)
    8 True

     bytes([source[, encoding[, errors]]]) 

    把source编译成指定编码

    >>> name = "YuanMing"
    >>> print(bytes(name, encoding = "UTF-8"))
    b'YuanMing'
    >>> print(bytes(name, encoding = "GBK"))
    b'YuanMing'

     callable(object) 

    1、方法用来检测对象是否可被调用,可被调用指的是对象能否使用()括号的方法调用.

    2、可调用对象,在实际调用也可能调用失败;但是不可调用对象,调用肯定不成功.

    3、类对象都是可被调用对象,类的实例对象是否可调用对象,取决于类是否定义了call方法.

    1 >>> name = "YuanMing"
    2 >>> callable(bool)
    3 True
    4 >>> callable(name)
    5 False
    6 >>> callable(1)
    7 False

     chr(i) 

    返回表示Unicode代码点为整数i的字符的字符串

    >>> chr(13)
    '
    '
    >>> chr(374)
    'Ŷ'
    >>> chr(45)
    '-'

     complex([real[, imag]]) 

    创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数

    >>> print(complex(1,2))
    (1+2j)
    >>> print(complex(1))
    (1+0j)
    >>> print(complex("1+2j"))
    (1+2j)

     dict() 

    创建字典

     dir([object]) 

    函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表

    >>> dir()
    ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'bar', 'func', 'func1', 'lis', 'name', 'reduce', 'test', 'test1', 'test2', 'x']
    >>> dir(bar)
    ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

     divmod(a, b) 

    返回一个包含商和余数的元组(a // b, a % b)

    >>> divmod(4,3)
    (1, 1)
    >>> divmod(7,2)
    (3, 1)

     enumerate(sequence, [start=0]) 

    把可迭代序列变为一个索引序列

    >>> name = ["YuanMing", "Marsh", "Jack"]
    >>> for i,k in enumerate(name,2):
        print(i,k)    
    2 YuanMing
    3 Marsh
    4 Jack

     eval(expression[, globals[, locals]]) 

    执行一个字符串表达式,并返回表达式的值

    expression -- 表达式;globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象;locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象

    >>> print(eval("1+2"))
    3
    >>> n = 3
    >>> print(eval("n+1"))
    4

     exec(object[, globals[, locals]]) 

    执行储存在字符串或文件中的 Python 语句

    object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

    locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

    >>> func_program = "print('You are so good')"
    >>> exec(func_program)
    You are so good
    >>> exec("print('Good!')")  ##冒号数量不能一样
    Good!

     float([x]) 

    将整数和字符串转换成浮点数

    >>> float(2)
    2.0
    >>> float(2.13)
    2.13

     hash(object) 

    获取一个对象(字符串或者数值等)的hash值

    >>> hash("YuanMing")
    5942654411917565357

     help([object]) 

    查看函数或模块用途的详细说明

    >>> help(help)
    Help on _Helper in module _sitebuiltins object:
    
    class _Helper(builtins.object)
     |  Define the builtin 'help'.
     |  
     |  This is a wrapper around pydoc.help that provides a helpful message
     |  when 'help' is typed at the Python interactive prompt.
     |  
     |  Calling help() at the Python prompt starts an interactive help session.
     |  Calling help(thing) prints help for the python object 'thing'.
     |  
     |  Methods defined here:
     |  
     |  __call__(self, *args, **kwds)
     |      Call self as a function.
     |  
     |  __repr__(self)
     |      Return repr(self).
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors defined here:
     |  
     |  __dict__
     |      dictionary for instance variables (if defined)
     |  
     |  __weakref__
     |      list of weak references to the object (if defined)

     hex(x) 

    将10进制整数转换成16进制,以字符串形式表示

    >>> hex(17)
    '0x11'
    >>> hex(21481)
    '0x53e9'

     id([object]) 

    获取对象的内存地址

    >>> name = 'YuanMing'
    >>> id(name)
    1725836378160
    >>> number = 23
    >>> id(number)
    1674538704

     input([prompt]) 

    接受一个标准输入数据,返回为 string 类型

     int(x, base=10) 

    将一个字符串或数字转换为整型,base是以什么为基础处理

    >>> int("3")
    3
    >>> int(2.41)
    2

     isinstance(object, classinfo) 

    判断一个对象是否是一个已知的类型

    sinstance() 与 type() 区别:

      • type() 不会认为子类是一种父类类型,不考虑继承关系。

      • isinstance() 会认为子类是一种父类类型,考虑继承关系。

    如果要判断两个类型是否相同推荐使用 isinstance()

    >>> test = "1"
    >>> isinstance(test,str)
    True
    >>> isinstance(test,int)
    False

     iter(object[, sentinel]) 

    用来生成迭代器

    >>> lis = [1,2,3]
    >>> for i in iter(lis):
        print(i)    
    1
    2
    3

     len(s) 

    测量数量

    >>> name = ["Jack", "Marsh", "Ada"]
    >>> len(name)
    3
    >>> len("akhfajfal")
    9

     max( x, y, z, .... ) 

    求最大值

    >>> max(15, 17, 1, 28)
    28
    >>> max([1,4,27,83])
    83

     min( x, y, z, .... ) 

    求最小值

    >>> min(15, 17, 1, 28)
    1
    >>> min([1,4,27,83])
    1

     next(iterator[, default]) 

    返回迭代器的下一个项目

     oct(x) 

    将一个整数转换成8进制字符串

    >>> oct(14)
    '0o16'
    >>> oct(6472)
    '0o14510

     open(name[, mode[, buffering]]) 

    打开文本

     print(*objects, sep=' ', end=' ', file=sys.stdout) 

    • objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。

    • sep -- 用来间隔多个对象,默认值是一个空格。

    • end -- 用来设定以什么结尾。默认值是换行符 ,我们可以换成其他字符串。

    • file -- 要写入的文件对象。

    >>> print("y","m",sep="-",end='%%')
    y-m%%

     range(start, stop[, step]) 

    返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表

    >>> range(1,6)
    range(1, 6)
    >>> for i in range(1,6):
        print(i)    
    1
    2
    3
    4
    5

     repr(object) 

    将对象转化为供解释器读取的形式

    >>> name = "YuanMing"
    >>> repr(name)
    "'YuanMing'"

     reversed(seq) 

    返回一个反转的迭代器

    >>> lis = [1,2,3,4]
    >>> reversed(lis)
    <list_reverseiterator object at 0x00000191D3DD6E48>
    >>> for i in reversed(lis):
        print(i)    
    4
    3
    2
    1

     round( x [, n] ) 

    返回浮点数x的四舍五入值

    >>> round(15.2174113,4)
    15.2174

     slice(start, stop[, step]) 

    实现切片对象,主要用在切片操作函数里的参数传递

    >>> myslice = slice(1,7,2)
    >>> arr = range(10)
    >>> arr[myslice]
    range(1, 7, 2)

     sorted(iterable, key=None, reverse=False) 

    排序

    >>> lis = [3,2,9,5,4,6,7,1]
    >>> print(sorted(lis, key = lambda x:x**-1, reverse=True))
    [1, 2, 3, 4, 5, 6, 7, 9]

     str(object='') 

    转换为str类型

    >>> str(1)
    '1'

     sum(iterable[, start]) 

    求和

    >>> sum([1,2,3,4,5])
    15

     type(name, bases, dict) 

    判断数据类型

    >>> type("1")
    <class 'str'>
    >>> type(1)
    <class 'int'>
    >>> type([1,2])
    <class 'list'>

     zip([iterable, ...]) 

    将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> c = [4,5,6,7,8]
    >>> zipped = zip(a,b)
    >>> print(list(zipped))
    [(1, 4), (2, 5), (3, 6)]
    >>> print(list(zip(a,c)))
    [(1, 4), (2, 5), (3, 6)]
    >>> a1, a2 = zip(*zip(a,b))   ## *zip为解压
    >>> print(list(a1), list(a2))
    [1, 2, 3] [4, 5, 6]

     vars([object]) 

    没有object时,就相当于local();有object时,就返回当前object所有的方法

    >>> def print_hello():
        msg = "Hello, World!"
        print(locals())
        print(vars())
    >>> print_hello()
    {'msg': 'Hello, World!'}
    {'msg': 'Hello, World!'}
    {'msg': 'Hello, World!'}
    {'msg': 'Hello, World!'}
    >>> print(vars(int))
    {'__repr__': <slot wrapper '__repr__' of 'int' objects>, '__hash__': <slot wrapper '__hash__' of 'int' objects>, '__str__': <slot wrapper '__str__' of 'int' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'int' objects>, '__lt__': <slot wrapper '__lt__' of 'int' objects>, '__le__': <slot wrapper '__le__' of 'int' objects>, '__eq__': <slot wrapper '__eq__' of 'int' …………………………………………………………
  • 相关阅读:
    手机维修费杂乱 消协命令设立扶植行业标准
    ImageList控件的使用方法
    三峡实习记之一
    [原创]2天的搜索经验对IIS的问题的全面解决方案
    亲历虚拟机安装Ubuntu Linux系统
    新的一年,新的开始
    VS2003中实现身份验证的探索经验
    [原创]VS2003中ASP.NET实现自定义用户导航控件
    全面控制Windows任务栏
    单刀赴广州
  • 原文地址:https://www.cnblogs.com/MingleYuan/p/10589197.html
Copyright © 2011-2022 走看看