python笔记-函数基础

2018-06-26 19次浏览 发表评论

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以def关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None

定义一个空函数

def nop():
    pass

可变参数

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

定义可变参数:参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。

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

r = calc(1, 2, 3)
print(r)

Python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。

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

r = [1, 2, 3, 4]
r = calc(*r)

print(r)

*r表示把r这个list的所有元素作为可变参数传进去。

关键字参数

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

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

extra = {'city': 'nanjing', 'job': 'Engineer'}
print(person('sunk', 30, **extra))

**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict。

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

命名关键字参数

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):
    return(name, age, city, job)
print(person('Jack', 24, city='nanjing', job='Engineer'))

命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):
    print(name, age, args, city, job)
  • 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
  • 要注意定义可变参数和关键字参数的语法:
  1. *args是可变参数,args接收的是数据集合;
  2. **kw是关键字参数,kw接收的是一个dict。
  • 以及调用函数时如何传入可变参数和关键字参数的语法:
  1. 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3))
  2. 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})
  • 使用*args**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
  • 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

参数解构

定义可变参数,如果不是可变参数,传参个数需要对应:

def add(*args):
    for i in args:
        i += i
    return i

t = (1, 2, 3, 4, 5)
l = [1, 2, 3, 4, 5]
s = {1, 2, 3, 4, 5}
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

print(add(t[0], t[1]))    #传入实参
print(add(*t))            #解构实参
print(add(*l))
print(add(*s))
print(add(*range(6)))     #结构可迭代对象
print(add(*d.values()))

评论

随便说点,聊聊天~