《Python基础教程》 读书笔记 第六章 抽象 函数 参数

6.1创建函数

函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值。一般来说,内建的callable函数可以用来判断函数是否可调用:

>>> x=1

>>> y=math.sqrt

>>> callable(x)

False

>>> callable(y)

True

定义函数用def 语句:

def fib(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result

6.1.1记录函数

给函数添加文档字符串:

>>> def square(x):

‘calculates the square of the number x‘

return x*x

文档字符串可以按如下方式访向:

>>> square.__doc__

‘calculates the square of the number x‘

在交互式解释器中使用help,就可以得到关于函数,包括它的文档字符串的信息:

>>> help(square)

Help on function square:

square(x)

calculates thesquare of the number x

6.2.1参数

在函数内为参数赋予新值不会改变外部任何变量的值:

>>> def try_to_change(n):

n=‘Mr.gumby‘

>>> name=‘Mrs.entity‘

>>> try_to_change(name)

>>> name

‘Mrs.entity‘

参数的默认值:

>>> def hello(greeting=‘hello‘,name=‘world‘):

print ‘%s,%s!‘%(greeting,name)

>>> hello()

hello,world!

>>> hello(‘greeting‘)

greeting,world!

>>> hello(‘greeting‘,‘universe‘)

greeting,universe!

6.2.2收集参数:

参数前的星号将所有值放置在同一个元组中。

>>> def print_params(*params):

print params

>>> print_params(‘testing‘)

(‘testing‘,)

>>> print_params(1,2,3)

(1, 2, 3)

联合普通参数

>>> defprint_params_2(title,*params):

print title

print params

>>>print_params_2(‘params:‘,1,2,3)

params:

(1, 2, 3)

如果不提供任何供收集的元素,params就是个空元祖

>>> print_params_2(‘nothing:‘)

nothing:

()

不能处理关键字参数:

>>>print_params_2(‘hmm...‘,something=42)

Traceback (most recent call last):

File "<input>", line 1, in <module>

TypeError: print_params_2() got anunexpected keyword argument ‘something‘

能处理关键字参数的“收集”操作:

>>> def print_params_3(**params):

... print params

...

>>> print_params_3(x=1,y=2,z=3)

{‘y‘: 2, ‘x‘: 1, ‘z‘: 3}#返回的是字典而不是元组

放一起用:

>>> defprint_params_4(x,y,z=3,*pospar,**keypar):

... print x,y,z

... print pospar

... print keypar

...

>>>print_params_4(1,2,3,5,6,7,foo=1,bar=2)

1 2 3

(5, 6, 7)

{‘foo‘: 1, ‘bar‘: 2}

>>> print_params_4(1,2)

1 2 3

()

{}

实现多个名字同时存储:

>>> def init(data):

data[‘first‘]={}

data[‘middle‘]={}

data[‘last‘]={}

def lookup(data,label,name):

return data[label].get(name)

def store(data,*full_names):

for full_name in full_names:

names=full_name.split()

if len(names)==2:names.insert(1,‘‘)

labels=‘first‘,‘middle‘,‘last‘

for label,name in zip(labels,names):

people=lookup(data,label,name)

if people:

people.append(full_name)

else:

data[label][name]=[full_name]

>>> store(d,‘luke skywalker‘,‘anakin skywalker‘)

>>> lookup(d,‘last‘,‘skywalker‘)

[‘luke skywalker‘, ‘anak in skywalker‘]

6.2.3反转过程

>>> def add(x,y):return x+y

>>> params=(1,2)

>>> add(*params)

3

处理字典:

>>> defhello_3(greeting=‘Hello‘,name=‘world‘):

... print ‘%s,%s!‘%(greeting,name)

...

>>> params={‘name‘:‘sirrobin‘,‘greeting‘:‘well met‘}

>>> hello_3(**params)

well met,sir robin!

星号只在定义函数(允许使用不定数目的参数)或者调用(“分割”字典或者序列)时才有用。

6.3作用域

全局作用域外,每个函数调用都会创建一个新的作用域:

>>> def foo():

... x=42

...

>>> x=1

>>> foo()

>>> x

1

赋值语句x=42只在内部作用域(局部命名空间)起作用,所以它并不影响外部(全局)作用域中的x。函数内的变量被称为局部变量(local variable,这是与全局变量相反的概念)。参数的工作原理类似于局部变量,所以用全局变量的名字作为参数名并没有问题。

要在函数内部访问全局变量:

>>> def combine(parameter):printparameter+external

>>> external=‘berry‘

>>> combine(‘shrub‘)

shrubberry

6.4递归

有用的递归函数包含以下几部分:

当函数直接返回值时有基本实例(最小可能性问题),递归实例,包括一个或者多个问题最小部分的递归调用。

6.4.1两个经典:阶乘和幂

>>> def factorial(n):

... result=n

... for i in range(1,n):

... result*=i

... return result

...

>>> factorial(5)

120

或:

>>> def factorial(n):

... if n==1:

... return 1

... else:

... return n*factorial(n-1)

...

>>> factorial(5)

120

计算幂:

>>> def power(x,n):

... result=1

... for i in range(n):

... result*=x

... return result

...

>>> power(2,3)

8

或:

>>> def power(x,n):

... if n==0:

... return 1

... else:

... return x*power(x,n-1)

...

>>> power(2,3)

8

本章的新函数:

map(func,seq[,seq,...]):对序列中的每个元素应用函数

filter(func .seq):返回其函数为真的元素的列表

reduce(func,seq[,initial]):等同于func(func(func(seq[0],seq[1]),...)

sum(seq):返回seq中所有元素的和

apply(func[,args[,kwargs]]):调用函数,可以提供参数

时间: 2024-08-24 11:08:11

《Python基础教程》 读书笔记 第六章 抽象 函数 参数的相关文章

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第06章 | 抽象

第06章  抽象 ------ 懒惰即美德 假如要计算斐波那契数列(任何一个数是前两数之和的数字序列) >>> fibs=[0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1]) #fibs[-2]+fibs[-1]后两位数,append往后添加 #运行后,包含10个斐波那契数列的10个数字是 >>> fibs [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 如果允许用户

SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5.1.2 使用参数 5.1.3 嵌套 5.1.4 多个引用 5.2 公用表表达式 5.2.1 分别列别名 5.2.2 使用参数 5.2.3 定义多个CTE 5.2.4 CTE的多次引用 5.2.5 递归CTE 5.3 视图 5.3.1 视图和ORDER BY 子句 5.3.2 视图选项 5.4 内嵌表

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n