zoukankan      html  css  js  c++  java
  • 函数、参数1

    1、函数的定义方式

    def 函数名([参数]):##参数可选

      语句体

    例:定义一个斐波那契数据的函数

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

    2、函数中的return,一般情况下,函数处理完后会返回值给调用的对象,也有的函数是不返回值的这种函数里的return就是用来终止函数的;所有的函数运行到return语句后就会终止

    >>> def hello():
      print('你好')
      return
      print('Hello')

    >>> hello  ###这里hello并不是调用函数hello
    <function hello at 0x000002691AD89BF8>
    >>> hello() ###调用函数hello(),打印你好,遇到return 函数终止运行,所以第二个打印Hello不执行;
    你好

    3、没有返回值的函数,实际返回的是None;函数在使用if条件语句时,最好每个条件都有返回值

    >>> x = hello()
    你好 ###这个不是返回值,返回值是赋值给了x的,你好是函数体内的打印

    >>> x
    >>> print(x) ###打印返回值,显示None
    None

    4、参数;大多数情况下我们使用函数都是有参数的,参数就是函数要处理的值;函数(参数)里的参数我们成为形参,我们调用函数时,实际传递的参数称为实参;函数处理时,因为不确定会传入什么参数,所以用形参表示实参,函数对形参进行处理;当我们调用函数时,将实参传递给形参,函数根据我们传入的实参,处理我们的数据;参数存储在局部作用域;

    ###这个函数fibs的形参是num,接收用户输入的值来生成需要的斐波那契额数据

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

    >>> x = fibs(8) ###调用fibs函数,8就是实参就是我们想要处理的数据,实参传递给形参类似给形参赋值;num=8
    >>> print(x)
    [0, 1, 1, 2, 3, 5, 8, 13]

    不可变参数: string、tuple、数字都是不可变的,它们不能被修改,只能替换

    >>> def change_to_name(name):
        name = 'Mr.Smith' 
        return name

    >>> name = 'Bob Gumby' ###外部元素name
    >>> x = change_to_name(name)  ####change_to_name(name)函数体内运行逻辑:name = name 内部变量和外部变量name都指向了 'Bob Gumby';name='Mr.Smith' 内部变量name重绑定了 'Mr.Smith' ;这时函数体内变量name是指向的‘Mr.Smith’,所以外部name指向的还是 'Bob Gumby';就是说函数体内部对外部变量进行重绑定(赋值),外部变量的值是不会变的(参数是list也是这样的)

    >>> x
    'Mr.Smith'
    >>> name  
    'Bob Gumby'

    可变参数:list,dict

    >>> def change(n):
        n[0] = 'Mr.Gumby'

    >>> names = ['Mr.Bob','Mr.Morse']
    >>> change(names) ###内部运转:n=names 指向同一个列表,n[0]='Mr.Gumby',修改列表内的值,列表也被修改,这时n和names还是指向同一个列表的所以 names输出也是修改后的列表
    >>> names
    ['Mr.Gumby', 'Mr.Morse']

    如果想对list类型参数进行修改而不改变原列表,可以用分片赋值法[:]赋值一个副本的list参数,对副本进行处理

    >>> def change(n):
    n[0]= ['Mr.Gumby']


    >>> names = ['Mr.Bob','Mr.Morse']
    >>> names_fu = names[:]
    >>> change(names_fu)
    >>> names_fu
    [['Mr.Gumby'], 'Mr.Morse']
    >>> names
    ['Mr.Bob', 'Mr.Morse']

    5、可变参数,实例:需要编写一个存储名字并且能用名字、中间名或姓查找联系人的程序

    用名字查找联系人----根据key查找value 数据类型dict{}

    》用名、中间名、姓查找联系人 初始化dict里面应该有三个key,考虑到多人情况,每个key再对应{} 里面为名:联系人,中间名:联系人,姓:联系人的方式

    》查找模式 dict[first/middle/last][名/中间名/姓]

    初始化数据结构 {“first”:{},'middle':{},'last':{}}

    >>> def init(data):
        data['first']={}
        data['middle']={}
        data['last']={}
        return data

    >>> mynames = {}
    >>> mynames = init(mynames)
    >>> mynames
    {'first': {}, 'middle': {}, 'last': {}}

    定义存储数据的函数:

    >>> 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):
          data[label][name]=[full_name]
        return data

    >>> full_name = 'liang yang yang'
    >>> mynames = store(mynames,full_name)
    >>> mynames
    {'first': {'liang': ['liang yang yang']}, 'middle': {'yang': ['liang yang yang']}, 'last': {'yang': ['liang yang yang']}}

    定义查找函数:

    >>> def lookup(data,label,name):
        return data[label][name]

    >>> print(lookup(mynames,'middle','yang'))
    ['liang yang yang']

    目前看这三个函数组合已经可以使用,但是还不完善,如果名字中(名、中间名、姓)某一项有重复的值呢

    >>> def store(data,full_name):
        names = full_name.split()###拆分full_names为一个列表,split()默认使用空格拆分
        if len(names)==2:
          names.insert(1,'')  ### 如果名字长度为2,则在中间插入一个空的字符串作为中间名
        labels = ['first','middle','last']
        for label,name in zip(labels,names): ###zip联合labels和names,每项为(label,name)格式
          try:
            people = lookup(data,label,name) ###查看一下输入的名字里 data[label][name]
          except KeyError as err:      ###如果data里不存在data[label][name]会抛出KeyError
            print('KeyError:%s'%str(err)) ###打印错误信息
            people = None     ###data里不存在data[label][name]不存在,则people=None
          finally:
            if people:   ###根据people的值,选择是添加到已有的列表中,还是创建新的项
              data[label][name].append(full_name)
            else:
              data[label][name]=[full_name]
        return data

    6、不可变参数

      函数是不能改变(不可变参数)的,只能从函数返回值,对参数重新处理

      

    >>> def inc(x):
        return x+1

    >>> foo = 100
    >>> inc(foo)  
    101
    >>> foo ###函数并没有改变参数foo
    100

    >>> foo = inc(foo)  ###对foo进行了赋值,改变了foo,并不是inc函数改变了foo
    >>> foo
    101

    ###如果想要用函数改变不可变参数,可以用可变参数替换

    >>> def inc(x):
        x[0]=1
        return x

    >>> foo = [10]
    >>> inc(foo)
    [1]
    >>> foo
    [1]

  • 相关阅读:
    APP测试之找密码
    测试理论
    LR性能测试
    Linux 操作系统常用命令
    C#后台HttpWebRequest代码调用WebService
    Python3在Windows下安装虚拟环境
    oracle使用rownum进行分页查询
    oracle over结合row_number分区进行数据去重处理
    Oracle实现主键自动增长
    Asp.net WebApi调用
  • 原文地址:https://www.cnblogs.com/t-ae/p/10852983.html
Copyright © 2011-2022 走看看