入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

python学习笔记之函数

创建时间:2017-04-30 投稿人: 浏览次数:1799

python学习笔记之函数

资料:廖雪峰官方网站-函数的参数


  • 定义函数
  def f_abs(x):
      if not isinstance(x,(int,float)):
          raise TypeError("bad operand type")
      if x<0:
          return -x
      elif x>0:
          return x
      else:
          return x
  • 空函数
    使用pass,创建空函数,待以后补上。但是不写pass空着会报错。
def f_pass():
    pass
  • 参数检查
    if not isinstance(x,(int,float)):
      raise TypeError("bad operand type")
  • 返回多个值
    return nx, ny
  • 使用python文件
    导入包的方式使用f_abs (位于test.py中)
from test import f_abs

即可使用f_abs

  • 函数参数 廖雪峰官方网站-函数的参数
    * 参数类型:位置参数,默认参数,可变参数,关键字参数,命名的关键字*

  • 位置参数
    就是我们使用的最普通的参数,所有位置参数都要传参。
    在传递参数时,我们可以写成赋值的形式:x=9,但是这种传参只能排在右边,并且要确保所有的参数都穿进去(赋值传参,很容易丢失参数,如测试)

    >>> def test(x,y,z):
    ...     print(x)
    ...     print(y)
    ...     print(z)
    ... 
    >>> test(9,y=0,z=0)
    9
    0
    0
    >>> test(z=3,y=2,x=1) #使用指定参数时,传参位置可以改变,但不能丢失,多次赋值
    1
    2
    3
    
    ------------以下是错误用例-----------------------
    >>> test(1,y=2,3)   #指定参数应该位于右侧,如同指定默认参数的方式
      File "<stdin>", line 1
    SyntaxError: positional argument follows keyword argument
    >>> test(1,x=2,z=3) #再次指定x,同时也丢失了一个位置参数
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: test() got multiple values for argument "x"
    
    • 默认参数
      python的默认参数比c++的更灵活:
      1、默认参数都需要放在最后边(必选参数必须在前,默认在后)
      2、可以仅修改需要的默认参数,而不必把该参数之前的默认参数都填上。
      (让一切看起来合理)
    def enroll(name,gender,age=6,city="changchun"):
        print(name)
        print(gender)
        print(age)
        print(city)
    
    -------------------------------
    output:
    >>> from test import enroll
    >>> enroll("liu","F")
    liu
    F
    6
    changchun
    >>> enroll("liu","F",city="handan")  #并没有填写city之前的默认参数age
    liu
    F
    6
    handan
    • 注意,默认参数指向对象生效的时间是定义时
      正是由于默认参数生效是在定义时(可以理解成第一次调用吧!X–这是错误的理解,默认参数指向的默认对象,应该伴随函数生命的从定义开始),而不是每次调用时。
      定义函数后,L即指向对象[],这个对象应该是伴随该函数的,随意在多次调用默认函数后,会发现追加多次END。
    def add_end(L=[]):
    L.append("END")
    return L
    
    >>> add_end()
    ["END", "END"]
    >>> add_end()
    ["END", "END", "END"]
    
    
    #解决办法,默认指向None,常量。
    
    def add_end(L=None):
    if L is None:
        L = []
    L.append("END")
    return L
  • 可变参数
    函数参数列表,看起来很简洁,但是可以传入多个参数。
    对于函数来说,收到的就是个tuple。
    形式:*args

    def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
    
    >>> calc(1, 2)
    5
    >>> calc()
    0
    
    >>> nums = [1, 2, 3] #也可以这样传进去
    >>> calc(*nums)
    14
  • 关键字参数
    该类型参数是指可以传入任意个带参数名的参数,即可以传入制定参数。
    这时传入的是dict,需要内部确定关键字参数的名字。
    形式:**kw

    def person(name, age, **kw):
    print("name:", name, "age:", age, "other:", kw)
    
    >>> person("Adam", 45, gender="M", job="Engineer")
    name: Adam age: 45 other: {"gender": "M", "job": "Engineer"}
    
    >>> extra = {"city": "Beijing", "job": "Engineer"}
    >>> person("Jack", 24, **extra) #也可这样传入
    name: Jack age: 24 other: {"city": "Beijing", "job": "Engineer"}
  • 命名关键字参数
     限制关键字参数的名字,传入时,必须指定参数。
     形式:(如果前边有可变参数(*args)则无需)

    def person(name, age, *, city, job):
        print(name, age, city, job)
    >>> person("Jack", 24, city="Beijing", job="Engineer")
    Jack 24 Beijing Engineer
    
    #如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
    
    
    def person(name, age, *args, city, job):
        print(name, age, args, city, job)
    
    #命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
    
    
    >>> person("Jack", 24, "Beijing", "Engineer")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: person() takes 2 positional arguments but 4 were given
  • 参数组合使用
    对于任意函数,都可以通过类似func(*args, **kw)的形式调用它
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像