Python基础教程 第六章 抽象和函数

2017年11月15日21:28:15
  • A+
所属分类:Python基础

本章将会介绍如何将语句组织成函数,还会介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途

 

6.3创建函数

函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值。

一般来说,内建的callable函数可以用来判断函数是否可调用:

 

那么怎么定义函数呢?使用def

 

6.3.1记录函数

def test():
'2323'
    return 2
print test().__doc__

 

 

_doc_是函数属性。

 

def test():

print 'This is printed'

return

这里的return语句只起到结束函数的作用:

 

列表用作参数!可以看着是java里面的数组,是传地址的

 

6.4.3 关键字参数和默认值

>>>hello_2(greeting='Hello'.name='world')

world. Hello!

这类使用参数名提供的参数叫做关健字参数。它的主要作用在于可以明确每个参数的作用

>>>store(patient='Mr. Brainsample'.hour=10, minute=20. day=13, month=5)

 

当参数具有默认值的时候,调用的时候就不用提供参数了!可以不提供、提供一些或提供所有的参数:

当只提供后面的参数时,会存在位置问题,可以在调用的时候直接指定参数名:

>>>helloes 3(name='Gumy')(name为第二个参数)

 

6.4.4收集参数

用户可以给函数提供任意多的参数。实现起来也不难。

试着像下面这样定义函数:

def print_arams(*params):

print params

 

test2(1,2,3,4,5)

(1, 2, 3, 4, 5)

 

所以星号的意思就是“收集其余的位置参数”。如果不提供任何供收集的元素,params就是个空元组

 

# **返回的是字典而不是元组。放一起用看看:
def print_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)
print_params_4(1, 2)

 

输出

(1, 2, 3, 4, 5)

1 2 3

(5, 6, 7)

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

 

1 2 3

()

{}

 

6.4.6练习使用参数

有了这么多种提供和接受参数的方法,很容易犯晕吧!所以让我们把这些方法放在一起举个例子。首先,我定义了一些函数:

def story(**kwds):
return 'Once upon a time, there was a ' \
'%(job)s called %(name)s. ' % kwds
print story(job='king',name='Gumby')
print story(name='Sir Robin',job='brave knight') # 参数位置调换

 

params = {'job':'language','name':'python'}
print story(**params)

 

del params['job']
print story(job='stroke of genius',**params)
输出:

Once upon a time, there was a king called Gumby.

Once upon a time, there was a brave knight called Sir Robin.

 

Once upon a time, there was a language called python.

 

Once upon a time, there was a stroke of genius called python.

 

函数二

def power(x, y, *others):
if others:
print 'Received redundant parameters:', others
return pow(x, y)

print power(2,3)

print power(3,2)

print power(y=3,x=2)

params=(5,)*2
print power(*params)

print power(3, 3, 'Hello, world')

 

8

9

8

3125

Received redundant parameters: ('Hello, world',)

27

 

 

函数三

def interval (start, stop=None, step=1):
'Imitates range() for step>0'
    if stop is None:            #如果没为stop提供梢….··…
      start, stop= 0, start     #指定参数
    result=[]
i=start                     #计算start索引
    while i<stop:               #直到计算}}Jstop的索引
        result.append(i)        #将索引添加到result内……
        i+=step                 #用step (>0)增加索引i . ....
    return result
print interval(10)
print interval(1,5)

print interval(3,12,4)

print power(*interval(3,7))

 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[1, 2, 3, 4]

[3, 7, 11]

Received redundant parameters: (5, 6)

81

 

6.5作用域

到底什么是变量?你可以把它们看作是值的名字。在执行X=I赋值语句后,名称X引用到值t。这就像用字典一样,键引用值,当然,变量和所对应的值用的是个“不可见”的字典。实际上这么说已经很接近真实情况了。内建的vars函数可以返回这个字典:

x=1

scope =vars()

print scope['x']

输出

1

这类“不可见字典”叫做命名空间或者作用域。那么到底有多少个命名空间?除了全局作用域外,每个函数调用都会创建一个新的作用域:

 

 

def change_ global():

global x

x=x+1

使用global 来声明x是全局变量

 

Python的函数是可以嵌套的,可以将函数放在另一个函数里面

 

 

6.6递归

def recursion();

return recursion()

 

6.6.1两个经典:阶乘和幂

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)

 

6.6.2另外一个经典:二元查找

 

 

def search(sequence, number, lower=0, upper=None):
if upper is None: upper=len(sequence)-1
if lower == upper:
assert number==sequence[upper]
print lower,' ',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)

seq = range(1,1000000001)
print search(seq,700000000)

 

 

6.7小结

本章介绍了关于抽象的常见知识以及函数的特殊知识。

口抽象。抽象是隐藏多余细节的艺术。定义处理细节的函数可以让程序更抽象。

0函数定义。函数使用def语句定义。它们是由语句组成的块,可以从“外部世界”获取值

(参数),也可以返回一个或者多个值作为运算的结果。

0参数。函数从参数中得到需要的信息-一一也就是函数调用时设定的变量。Python中有两类

参数:位置参数和关键字参数。参数在给定默认值时是可选的。

0作用域。变量存储在作用域(也叫做命名空间)中。Python中有两类主要的作用域一一全

局作用域和局部作用域。作用域可以嵌套。

口递归。函数可以调用自身—如果它这么做了就叫做递归。一切用递归实现的功能都可

以用循环实现,但是有些时候递归函数更易读。

0函数型编程。Python有一些进行函数型编程的机制。包括lambda表达式以及map, filter

和。educe函数。

 

 

表6-,本章的新函数

函数描述

map(func, seq〔,seq,…〕)对序列中的每个元素应用函数

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

reduce(func, seq[,initial])等同于func(func(fur}(seq[0], seq[1]), seq[2])二)

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

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

 

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: