zoukankan      html  css  js  c++  java
  • day5 函数和参数

    函数就是最基本的一种代码抽象的方式

    定义一个函数使用def语句

    def my_abs(x):
      if x >= 0:
        return x
      else:
        return -x

    定义一个什么事也不做的空函数(可以用来作为占位符)

    def nop():

      pass

    数据类型检查可以用内置函数 isinstance()实现:

    def my_abs(x):
    if not isinstance(x, (int, float)):
    raise TypeError('bad operand type')
    if x >= 0:
    return x
    else:
    return -x

    定义函数时,需要确定函数名和参数个数;
    如果有必要,可以先对参数的数据类型做检查;
    函数体内部可以用 return 随时返回函数结果;
    函数执行完毕也没有 return 语句时,自动 return None。
    函数可以同时返回多个值,但其实就是一个 tuple。

    位置参数

    计算平方,立方,4次方。。。。

    def power(x, n):
        s = 1
        while n > 0:
              n = n - 1
              s = s * x
         return s
    a = power(5, 2)
    print(a)

    设置默认参数时,有几点要注意:
    一是必选参数在前,默认参数在后,否则 Python 的解释器会报错
    (思考一下为什么默认参数不能放在必选参数前面);
    二是如何设置默认参数。
    当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。
    变化小的参数就可以作为默认参数。
    使用默认参数有什么好处?
    最大的好处是能降低调用函数的难度。

    三默认参数必须指向不变对象

    默认参数

    def enroll(name, gender, age=6, city='Beijing'):
       print('name:', name)
       print('gender:', gender)
       print('age:', age)
       print('city:', city)
    >>> enroll('Sarah', 'F')
    name: Sarah
    gender: F
    age: 6
    city: Beijing

    调用的时候,既可以按顺序提供默认参数,比如调
    用 enroll('Bob', 'M', 7)

    可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,
    需要把参数名写上。比如调用 enroll('Adam', 'M', city='Tianjin')

    可变参数

    在函数内部自动组装成list或tuple

    给定一组数字 a,b,c……,请计算 a的平方加b的平方加c的平方.....

    方法1 list或tuple

    def calc(numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum

    调用时,需先组装出list或tuple

    >>>calc([1, 2, 3])

    14

    >>>calc((1, 3, 5, 7))

    84

    方法二 可变参数

    def calc(*numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum

    >>> calc(1, 2, 3)
    14
    >>> calc(1, 3, 5, 7)
    84

    已经有一个 list 或者 tuple,要调用一个可变参数

    >>> nums = [1, 2, 3]
    >>> calc(*nums)
    14

    关键字参数

    充许传入0个或任意个含参数名的参数,在函数内部自动组装成dict

    def person(name, age, **kw):
        print('name:', name, 'age:', age, 'other:', kw)

    >>> person('Michael', 30)
    name: Michael age: 30 other: {}
    也可以传入任意个数的关键字参
    >>> person('Bob', 35, city='Beijing')
    name: Bob age: 35 other: {'city': 'Beijing'}
    >>> person('Adam', 45, gender='M', job='Engineer')
    name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

    和可变参数类似,也可以先组装出一个 dict,然后,把该 dict 转换为关
    键字参数传进去:
    >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
    >>> person('Jack', 24, city=extra['city'], job=extra['job'])
    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
    当然,上面复杂的调用可以用简化的写法:
    >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
    >>> person('Jack', 24, **extra)
    name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

    注意kw获得的dict是extra的拷贝,kw的改动不会影响到函数外的extra

    命名关键字参数

    限制关键字参数的名字,就可以用命名关键字参数例如,只接
    收 city 和 job 作为关键字参数
    def person(name, age, *, city, job):
        print(name, age, city, job)
    和关键字参数**kw 不同,命名关键字参数需要一个特殊分隔符*,*后面
    的参数被视为命名关键字参数,命名关键字参数必须传入参数名。

    命名关键字参数可以有缺省值,从而简化调用:
    def person(name, age, *, city='Beijing', job):
        print(name, age, city, job)
    由于命名关键字参数 city 具有默认值,调用时,可不传入 city 参数:
    >>> person('Jack', 24, job='Engineer')
    Jack 24 Beijing Engineer

    参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。

     

  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/wwchihiro/p/10216111.html
Copyright © 2011-2022 走看看