函数
函数执行特定的操作并返回一个值,你可以调用它 调用时可能需要提供一些参数——放在圆括号中的内容
定义函数
def hello(name):
return 'Hello, ' + name + '!'
>>> print(hello('world'))
Hello, world!
def square(x):
'Calculates the square of the number x.'
return x * x
# 可以像下面这样访问文档字符串:
>>> square.__doc__
'Calculates the square of the number x.'
函数参数
函数参数存储在 局部作用域内
# 位置参数
pass 普通函数
# 关键字参数和默认值 为了简化调用工作,可指定参数的名称。关键字参数最大的优点在于,可以指定默认值
>>> hello_1(name='world', greeting='Hello')
Hello, world!
def hello_3(greeting='Hello', name='world'):
print('{}, {}!'.format(greeting, name))
# 收集参数,如果没有可供收集的参数, params 将是一个空元组
def print_params(*params):
print(params)
>>> print_params(1, 2, 3)
(1, 2, 3)
def print_params_2(title, *params):
print(title)
print(params)
>>> print_params_2('Params:', 1, 2, 3)
Params:
(1, 2, 3)
>>> def in_the_middle(x, *y, z):
... print(x, y, z)
...
>>> in_the_middle(1, 2, 3, 4, 5, z=7)
1 (2, 3, 4, 5) 7
要收集关键字参数,可使用两个星号。
>>> def print_params_3(**params):
... print(params)
...
>>> print_params_3(x=1, y=2, z=3)
{'z': 3, 'x': 1, 'y': 2}
# 分配参数
def add(x, y):
return x + y
params = (1, 2)
>>> add(*params) #通过在调用函数(而不是定义函数)时使用运算符 * 实现的
3
def hello_3(greeting='Hello', name='world'):
print('{}, {}!'.format(greeting, name))
>>> params = {'name': 'Sir Robin', 'greeting': 'Well met'}
>>> hello_3(**params)
Well met, Sir Robin!
作用域
有一个名为 vars 的内置函数,它返回这个不可见的字典,这种“看不见的字典”称为命名空间或作用域
>>> x = 1
>>> scope = vars()
>>> scope['x']
1
>>> scope['x'] += 1
>>> x
2
函数内使用的变量称为局部变量(与之相对的是全局变量)。参数类似于局部变量,因此参数与全局变量同名不会有任何问题
>>> def output(x): print(x)
...
>>> x = 1
>>> y = 2
>>> output(y)
2
可使用函数 globals 来访问全局变量。这个函数类似于 vars ,返回一个包含全局变量的字典。( locals 返回一个包含局部变量的字典。)
递归
阶乘和幂
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
def power(x, n):
if n == 0:
return 1
else:
return x * power(x, n - 1)
二分查找
def search(sequence, number, lower, upper):
if lower == upper:
assert number == sequence[upper]
return upper
else:
middle = (lower + upper) // 2
if number > sequence[middle]:
return search(sequence, number, middle + 1, upper)
else:
return search(sequence, number, lower, middle)
新函数
类
自定义类
class Person:
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def greet(self):
print("Hello, world! I'm {}.".format(self.name))
类的命名空间
在 class 语句中定义的代码都是在一个特殊的命名空间(类的命名空间)内执行的,而类的所有成员都可访问这个命名空间
class MemberCounter:
members = 0
def init(self):
MemberCounter.members += 1
>>> m1 = MemberCounter()
>>> m1.init()
>>> MemberCounter.members
1
>>> m2 = MemberCounter()
>>> m2.init()
>>> MemberCounter.members
2
如果你在一个实例中给属性 members 赋值,结果将如何呢?
>>> m1.members = 'Two' #新值被写入 m1 的一个属性中,这个属性遮住了类级变量
>>> m1.members
'Two'
>>> m2.members
2
抽象类
from abc import ABC, abstractmethod
class Talker(ABC):
@abstractmethod
def talk(self):
pass