美文网首页
python基础教程笔记(chapt.6) 函数

python基础教程笔记(chapt.6) 函数

作者: JuneZhu_870a | 来源:发表于2017-10-24 16:25 被阅读12次

    函数名(位置参数,关键参数,params,*param)

    * 调用时,位置参数写在最前面。

    * *params收集其余的位置参数,返回tuple。

    * **params收集其余的关键参数,返回字典。

    裴波那契数列(任一个数都是前两个数之和):

    fibs=[0,1]
    for i in range(8):
        fibs.append(fibs[-2]+fibs[-1]
    ###############
    fibs=[0,1]
    num=input("How many Fibonacci numbers do you want?')
    for i in range(num-2):
        fibs.append(fibs[-2]+fibs[-1])
    print fibs
    ########################
    num=input("How many Fibonacci numbers do you want?')
    pint fibs(num)
    #先调用,后面再写独立的函数定义
    

    创建函数

    callable(函数名) 2.0版本, hasattr(func, _call) 3.0版本: 判断函数是否可调用
    def 函数名(参数):
    return 返回值
    返回值可有可无,return只是标注函数的结束。
    举例:
    'create a fibonacci`是文档字符串,对函数进行解释,可以用函数名.doc调用查看

    def fibs(num):
      'create a fibonacci`
        result=[0,1]
        for i in range(num-2):
            result.append(result[-2]+fibs[-1])
        return result
    

    练习:建立一个姓名数据库,可以通过中间名/姓/名查有谁,还可以通过输入全名添加记录。

    #-*- coding:utf8 -*-
    '''
        #数据结构
        storage={}
        storage['first']={}
        storage['middle']={}
        storage['last']={}
    '''
    
    def init(data):
        '初始化数据结构'
        data['first']={}
        data['middle']={}
        data['last']={}
        return
    
    
    # storage={}
    # init(storage)
    # print storage
    # me='Magnus Lie Hetland'
    # storage['first']['Magnus']=[me]
    # storage['middle']['Lie']=[me]
    # storage['last']['Hetland']=[me]
    # print storage
    # print storage['middle'].get('Lie')
    
    
    def lookup(data, label, name):
        '查询名字'
        return data[label].get(name)
    
    #存储单个名字
    def store(data, full_name):
        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]
    
    # mynames={}
    # init(mynames)
    # #print mynames
    # store(mynames,'Magnus Lie Hetland')
    # #print mynames
    # store(mynames,'Robin Hood')
    # store(mynames,'Robin Locksley')
    # #print mynames
    # lookup(mynames,'first','Robin')
    # store(mynames,'Mr. Gumby')
    # #print mynames
    # print lookup(mynames,'middle','')
    
    #批量存储名字
    def store2(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]
    

    疑问:


    反转参数疑惑

    函数练习:

    #-*- coding:utf8 -*-
    def story(**kwds):
        return 'Once upon a time, there was a' '%(job)s called %(name)s.'%(kwds)
    
    def power(x,y,*others):
        if others:
            print 'Reveived redundant parameters: ', others
        return pow(x,y)
    
    def interval(start, stop=None, step=1):
        'Imitates range() for setp >0'
        if stop is None:  # 如果未提供stop参数
            start, stop=0, start  # 指定参数
        result=[]
        i=start  # 计算start索引
        while i < stop:  # 直到计算到stop的索引
            result.append(i)  # 将索引添加到result内
            i += step  # 用step (>0) 增加索引i
        return result
    
    params=(5,) *2
    power(*params)
    # 结果:3125
    power(3,3,'Hello, world')
    # 结果:Received redundant parameters:('Hello, word')   27
    
    interval(10)
    # 结果:[0,1,2,3,4,5,6,7,8,9]
    

    作用域

    变量和所对应的值用的是个不可见的字典,这个字典就是命名空间或者作用域,内建函数vars可以返回这个字典

    >>>x=1
    >>>scope=vars()
    >>>scope['x']
    >>>1
    >>>scope['x']+=1
    >>>x
    2
    

    每个函数都会创造一个新的作用域,函数内的赋值语句只在内部作用域(局部命名空间)起作用,产生局部变量,它不影响外部(全局)作用域中相同名称的变量(全局变量)。
    函数内访问全局变量

    >>>def combine(parameter):
        print parameter + globals()['parameter']
    ...
    >>>parameter='berry'
    >>>combine('shrub')
    shrubbery
    

    在函数内声明全局变量

    >>>x=1
    >>>def change_global():
              global x
              x=x+1
    >>>change_global()
    >>>x
    2
    

    嵌套函数:
    函数存储子封闭作用域的行为称之为闭包

    def multiplier(factor):
          def multiplyByFactor(numer):
              return number*factor
          return multiplyByFacotor
    
    >>>double=multiplier(2)
    >>>double(5)
    10
    >>>multiplier(5)(4)
    20
    

    递归

    有用的递归包含:

    1. 当函数直接返回值时有基本实例(最小可能性问题),如无,则会产生无穷递归
    2. 递归实例,包括一个或者多个问题最小部分的递归调用
      阶乘(n(n-1)(n-2)...1)
    def factorial(n):
        result=n
        for i in range(1,n)
            result *= i 
        return result
    ########################
    #1的阶乘是1
    #大于1的数n的阶乘是n*(n-1)的阶乘
    def factorial(n):
        if n==1:
            return 1
        else:
            return n*factorial(n-1)
    

    幂:
    0的幂都为0
    1的幂都为1
    任何数的0幂都为1
    x的n次幂为x* x的n-1次幂

    def pow(x,n):
        if x = 0 and n =!0:
            return 0
        elif x=1 or n=0:
            return 1
        else:
            return x*pow(x,n-1)
    

    二元查找(binary serach)
    两者中点,查找在左侧还是右侧,继续查找数字所在那部分。
    下面的内容完全可以用index来找。。

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

    其他:1-3全部可以用列表推导式代替!而且更方便,或者更易读

    1. map: map格式: map(str,range(10)) # 意思就是 [str(i) for i in range(10)]
    2. filter:基于返回布尔值对元素过滤
      isalnum是判断是否是数字或者字符
    def func(x):
        return x.isalnum()
    seq=['foo','x41','?!','***']
    filter(func,seq) #结果:['foo','x41']
    # [x for x in seq if x.isalnum()]
    
    1. lambda匿名函数: filter(lambda x: x.isalnum(), seq)
    2. reduce: 将序列前两个元素与给定函数联合使用,并将返回值和第三个元素继续联合使用,直到序列处理完毕,得到最终结果。
      reduce(lambda x,y:x+y, numbers)

    相关文章

      网友评论

          本文标题:python基础教程笔记(chapt.6) 函数

          本文链接:https://www.haomeiwen.com/subject/bijtpxtx.html