zoukankan      html  css  js  c++  java
  • 《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]]):调用函数,可以提供参数

  • 相关阅读:
    SQL语句中的GO
    别人如何使用JsUnit的
    类,子类,继承,virtual, abstract, override
    尝到JsUnit自动测试的甜头
    A class file was not written. The project may be inconsistent, if so try refreshing this project and building it. eclipse提示错误
    正则表达式收集
    jquery 无限级下拉菜单
    javascript学习笔记,绝对值,倒计时,按数字计算
    java 常识
    jquery ajax 从后台获取数据时 firefox控制台显示未组织好错误
  • 原文地址:https://www.cnblogs.com/jpld/p/4518754.html
Copyright © 2011-2022 走看看