zoukankan      html  css  js  c++  java
  • python学习记录 函数

    note:以下类容来源于网络,作为自己学习摘抄记录,方便以后查看

    返回多个值

    比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:

    import math
    
    def move(x, y, step, angle=0):
        nx = x + step * math.cos(angle)
        ny = y - step * math.sin(angle)
        return nx, ny

    这样我们就可以同时获得返回值:

    x, y = move(100, 100, 60, math.pi / 6)
    print x, y

    结果如下:
    151.961524227 70.0

    但其实这只是一种假象,Python函数返回的仍然是单一值:

    r = move(100, 100, 60, math.pi / 6)
    print r

    结果如下:

    (151.96152422706632, 70.0)

    原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

     默认参数

    默认值在函数 定义 作用域被解析,如下所示:

    i = 5
    def f(arg=i):
        print arg
    
    i = 6
    f()

    将会输出 5。

    重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:

    def f(a, L=[]):
        L.append(a)
        return L
    
    print f(1)
    print f(2)
    print f(3)
    这将会打印:
    [1]
    [1, 2]
    [1, 2, 3]

    所以,定义默认参数要牢记一点:默认参数必须指向不变对象!如果你不想在随后的调用中共享默认值,可以像这样写函数:

    def f(a, L=None):
        if L is None:
            L = []
        L.append(a)
        return L
    print f(1)
    print f(2)
    print f(3)
    这将会打印:
    [1]
    [1]
    [1]

    关键字参数
    函数可以通过 关键字参数 的形式来调用,形如 keyword = value。
    使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

    def printinfo( name, age ):
       print "Name: ", name;
       print "Age ", age;
       return;
     
    printinfo( age=50, name="miki" );
    def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
        print "-- This parrot wouldn't", action,
        print "if you put", voltage, "volts through it."
        print "-- Lovely plumage, the", type
        print "-- It's", state, "!"

    以上的函数:接受一个必选参数( voltage )以及三个可选参数( state, action, 和 type )。可以用以下的任一方法调用:

    parrot(1000)                                          # 1 positional argument
    parrot(voltage=1000)                                  # 1 keyword argument
    parrot(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments
    parrot(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments
    parrot('a million', 'bereft of life', 'jump')         # 3 positional arguments
    parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword

    不过以下几种调用是无效的:

    parrot()                     # required argument missing
    parrot(voltage=5.0, 'dead')  # non-keyword argument after a keyword argument
    parrot(110, voltage=220)     # duplicate value for the same argument
    parrot(actor='John Cleese')  # unknown keyword argument

    在函数调用中,关键字的参数必须跟随在位置参数的后面。传递的所有关键字参数必须与函数接受的某个参数相匹配(例如 actor 不是 parrot 函数的有效参数),
    它们的顺序并不重要。这也包括非可选参数(例如 parrot(voltage=1000) 也是有效的)。任何参数都不可以多次赋值。

    可变参数列表

    可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。

    def printinfo( arg1,arg2=20, *vartuple ):
    
       print "output: "
       print arg1
       print arg2
       print vartuple
       for var in vartuple:
          print var
       return;
     
    printinfo( 10 );
    printinfo( 70, 60, 50,40 );

    结果如下:

    output:
    10
    20
    ()
    output:
    70
    60
    (50, 40)
    50
    40

    关键字参数

    关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:

    def person(name, age, **kw):
        print 'name:', name, 'age:', age, 'other:', kw
    
    person('Michael', 30)
    person('Adam', 45, gender='M', job='Engineer')

    结果如下:

    name: Michael age: 30 other: {}
    name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

    还可以这样调用

    kw = {'city': 'Beijing', 'job': 'Engineer'}
    person('Jack', 24, city=kw['city'], job=kw['job'])
    kw = {'city': 'Beijing', 'job': 'Engineer'}
    person('Jack', 24, **kw)

    结果如下:

    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

    参数组合
    在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
    比如定义一个函数,包含上述4种参数:

    def func(a, b, c=0, *args, **kw):
        print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw

    在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

    func(1, 2)
    func(1, 2, c=3)
    func(1, 2, 3, 'a', 'b')
    func(1, 2, 3, 'a', 'b', x=99)

    结果如下

    a = 1 b = 2 c = 0 args = () kw = {}
    a = 1 b = 2 c = 3 args = () kw = {}
    a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
    a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}

    最神奇的是通过一个tuple和dict,你也可以调用该函数:

    args = (1, 2, 3, 4)
    kw = {'x': 99}
    func(*args, **kw)

    结果如下

    a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}
  • 相关阅读:
    Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary detail 1 2.1. Diary 1987---2016.12 1 2.2. Diary20
    Atitit web httphandler的实现 java python node.js c# net php 目录 1.1. Java 过滤器 servelet 1 1.2. Python的
    Atitit 网关协议cgi wsgi fcgi fastcgi 目录 1.1. CGI(common gateway unterface) 1 1.2. 2.1 WSGI: 1 1.3. 2.3
    Atitit gui的实现模式文本 dom ast 像素绘图api native 目录 1. Pl ast xml domAst 1 1.1. 简介 1 1.1.1. 【具体语法树】 2 2.
    Atitit 遍历文件夹目录解决方案与规范 attilax总结 1. 规范 2 1.1. 注意的不要同时改变文件夹内容,增删文件。这样获取到的目录list不会变化 2 1.2. 主义中文名称文件读写
    Atitit node.js自定义模块化 Function walkFileTree() exports.walkFileTree =walkFileTree 引用  Files=require
    Atitit node.js问题解决总结t99 目录 1.1. 找不到node程序 1 1.2. GBK编码问题 1 2. 按行读取gbk编码问题 2 2.1. 先写入txt utf8 encode
    Atitit io读取文件法 目录 1. 文件法 1 1.1. 异步读取文件: 1 1.2. 2.同步读取方法 1 1.3. 二进制读文件: 1 2. 读取api规范 1 3. Atitit 按照
    Atitit 按照行读取文件 目录 1.1. 类库'readline' 1 1.2. 类库C:workspacedataindexGenerNodejssdkioFileUtils.js
    Atitit sumdoc index 2019 v6 t56 .docx Atitit sumdoc index s99 目录 1. Zip ver 1 1.1. C:UsersAdminis
  • 原文地址:https://www.cnblogs.com/llgg/p/5852461.html
Copyright © 2011-2022 走看看