zoukankan      html  css  js  c++  java
  • python函数(一)

    python函数(一)

    1、函数的定义:

    def test():
        print('test is running...')
        return
    

    定义一个函数,有3个部分需要注意:

    1. 函数名称。函数的命名规范与变量类似:不能以数字开头、不能包含非法字符、不能包含空格,以及不要使用python的保留字;
    2. 函数的参数。名称后的括号内是函数的参数,这种参数属于形式参数,也就是作为传递用的参数。参数包括位置参数和关键字参数。
    3. 函数的返回值。return语句一般写在函数的最后一句,执行到return时函数就会终止。每一个函数都有return语句,有些函数没有显式地写出返回值,python默认将None作为返回值返回。

    2、函数的调用

    使用“函数名+实参”的方式来调用函数。

    def test1(x):
        x = x + 1
        print('test1 is running in x + 1')
        return x
    
    i = test1(3)
    print(i)
    

    打印结果:

    test1 is running in x + 1
    4
    

    上述例子中,形参就是x,test1的作用是将传入的x加1后返回。在调用函数时,3就是被传入的实参。函数运行后,将函数的返回值赋给i,并打印i。
    python中可以声明同名函数,但是调用时会调用距离最近的那个函数。

    def foo():
        print('far foo()...')
    
    def foo():
        print('near foo()...')
    
    foo()
    

    打印结果:

    near foo()...
    

    3、函数的参数

    在定义函数时,可以在函数名称后面的括号内指定函数的参数。python中函数的参数可以分为2类:位置参数和关键字参数。

    位置参数

    位置参数,在传入实参时按照参数的位置一一对应。这类参数不能重名(不能指定两个相同的位置参数)。

    # 求 x 的 n 次方
    def power(x, n):
        sum = x
        while n > 1:
            sum *= x
            n -= 1
        return sum
    
    i = power(3, 5)
    print('{0}的{1}次方是'.format(3, 5), i)
    

    打印结果:

    3的5次方是 243
    

    上述例子中,3和5依次传给power(x, n)中的x和n。函数定义时指定了几个位置参数,就要传入几个位置参数,否则会报错。

    关键字参数

    关键字参数也叫默认参数,指定参数的参数的形式如下:key=value。这种指定形式类似于字典。在声明关键字参数时,不仅需要形参的名称,还要为该形参指定一个默认值。

    def getAge(bornyear, name='Tom'):
        import datetime as dt
        age = dt.datetime.now().year - bornyear
        print(name + '的年龄为' + str(age) + '岁')
    
    
    getAge(1993)
    getAge(1922, 'Lord')
    

    打印结果:

    Tom的年龄为26岁
    Lord的年龄为97岁
    

    上述函数中,bornyear是一个位置参数,name就是一个关键字参数,指定的默认值为'Tom'。在调用该函数时,如果不显式地为name重新赋值,则函数就会按照默认值进行输出。
    关键字参数可以按照默认位置顺序提供参数,如:getAge(1922, 'Lord');也可以使用name='Jerry'这种形式为参数赋值。使用后一种赋值形式时,关键字参数的位置可以随意调换。

    def enroll(name='Jerry', score='F', major='math'):
        print('姓名:' + name + ',主修:' + major + ',成绩:' + score)
    
    enroll(major='computer',score='A',name='Hagrid')
    

    打印结果:

    姓名:Hagrid,主修:computer,成绩:A
    

    参数之间的关系

    (1) 首先,位置参数必须在关键字参数前声明,赋值时,位置参数也必须先进行赋值。

    (2) 其次,关键字参数在声明默认值时,默认值必须是不可变对象(如字符串、整型或元组)。因为在第一次调用函数时,默认参数所指向的变量会在内存中被创建出来。如果再次调用,它所指向的变量就会变成改变后的对象了,默认参数的内容就会改变。

    def add_cake(L=[]):
        L.append('cake')
        return L
    
    
    print(add_cake())
    print(add_cake())
    

    打印结果:

    ['cake']
    ['cake', 'cake']
    

    上述例子中,add_cake函数中的L默认指向了一个list(可变对象)。在第一次调用add_cake函数时,L变量就被创建出来,第二次调用就会指向已创建的L对象,调用append方法也就是在所创建的L后面添加元素。

    (3) 可变参数的声明。当一个函数需要传入多个值时,可以声明一个形参,并在前面加上*,python就会把传入的多个值组成一个tuple。

    def getSum(*num):
        sum = 0
        for i in num:
            sum += i
        return sum
    
    
    v = getSum(1, 3, 5, 7, 34)
    print(v)
    

    这种写法的好处是,当需要传入可遍历参数(如list或tuple)时,你可以直接传入单个值而不用把它们写成[]或()了。
    这种方法也可以将已有的list或tuple中的所有元素当作可变参数传入。
    对于关键字参数,可以在形参前加上**,表示把传入的参数组成一个dict.

    def getInfo(name, age, **kwargs):
        print(name, age, kwargs)
    
    # 只传入位置参数
    getInfo('Harry', 18)
    
    # 可以传入任意数量的关键字参数
    getInfo('Harry', 18, city='London', score='F')
    

    打印结果:

    Harry 18 {}
    Harry 18 {'city': 'London', 'score': 'F'}
    

    同样,也可以将已有的dict中的所有元素当成可变参数传入。

    (4) 当一个函数使用(*args, **kw)来表示其参数时,表示该函数可以接收任意类型、任意数量的参数。

    def getPerson(*args,**kwargs):
        print(args, kwargs)
    
    getPerson('name is Tom', age=15, city='New York')
    

    打印结果:

    ('name is Tom',) {'age': 15, 'city': 'New York'}
    

    可以看到,*args即可变的位置参数,被组成了元组;**kwargs被组成了字典。

  • 相关阅读:
    用户添加到sudoer列表## Allow root to run any commands anywhere root ALL=(ALL) ALL Iron ALL=(ALL) ALL
    Linux下script命令录制、回放和共享终端操作script -t 2> timing.log -a output.session # 开始录制
    解决nohup: 忽略输入并把输出追加到"nohup.out"或者nohup: 忽略输入重定向错误到标准输出端
    grub救援模式
    如何讓RHEL7/CentOS7開機過程顯示更多資訊
    CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
    对angular实现延迟加载template和controller
    angularjs+jasmine单元测试入门
    设计模式简单工厂之我见
    融云官方cordova示例使用指南
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10276740.html
Copyright © 2011-2022 走看看