zoukankan      html  css  js  c++  java
  • Python中的函数

    函数

    由函数名、参数列表以及语句块构成的能实现某种功能的代码段。函数可以按照功能组织代码,减少代码冗余。是结构化编程的核心

    函数的定义

    使用def语句定义函数

    def 函数名(参数列表):
        函数体( 代码块 )
        [return 返回值]
    
    函数定义时,参数列表称为形式参数
    语句块以4个空格缩进,如果没有return语句,会隐式返回None

    函数的定义只是声明了一个函数,如果要执行,需要对其调用。调用函数时,使用函数名后加小括号的方式,传入的参数称为实参

    定义一个函数

    def fibs(num):
        fib = [0, 1]
        for i in range(num):
            fib.append(fib[i] + fib[i + 1])
        return fib
    
    f5=fibs(
    5)
    print(f5)

    上面定义了一个函数 fibs,计算的结果通过return返回。调用时传入了一个参数,返回值使用变量 f5接收

    函数调用应该在定义之后,否则会报错NameError

    通过callable()判断对象是否可调用

    In [28]: callable(fibs)
    Out[28]: True
    
    In [29]: a=1
    
    In [30]: callable(a)
    Out[30]: False

    函数的参数

    函数调用时传入的参数必须和定义时的个数相匹配(除可变参数)

    位置参数

    按照参数定义的顺序传入实参

    def fx(x, y):
        result = x + y
        return result
    
    fx(1,2) 

    关键字参数

    def fx(x, y):
        result = x + y
        return result
    
    fx(y=1, x=2)     ## 传入参数的顺序可以和定义时参数的顺序不同

    注意:位置参数和关键字参数是在调用时才有的概念。位置参数必须在关键字参数之前传入,否则报错

    def fx(x, y):
        result = x + y
        return result
    
    fx(y=1, 2)

    运行结果

        fx(y=1, 2)
               ^
    SyntaxError: positional argument follows keyword argument

    参数默认值

    定义参数时,在形参后面给定一个值,当为传入足够的实参时,将使用此值为默认值

    def fx(x=1, y=3):
        result = x + y
        return result
    
    num=fx(y=1)
    print(num)

    运行结果:
    2

    可变参数

    有如下代码,需要求可迭代对象的和:

    def fx(lst):
        sum = 0
        for x in lst:
            sum += x
        return sum
    
    x = fx([1, 2, 3])
    print(x)

    位置参数可变参数

    将多个多个实参收集为一个tuple,使用*表示该形参是可变参数

    def fx(*lst):
        sum = 0
        for x in lst:
            sum += x
        return sum
    
    x = fx(1, 2, 3)
    print(x)

    关键字参数的可变参数

    形参前使用**,可以接受多个关键字参数,收集后的实参名和值组成字典

    def fx(**lst):
        sum = 0
        for _,x in lst.items():
            sum += x
        return sum
    
    x = fx(a=1, b=2, c=3)
    print(x)

    keyword-only参数

    Python3中新引入的。在一个星号参数或者位置可变参数后,出现的普通参数为keyword-only参数

    def fx(*args,x,y):
        print(x,y)
        print(args)
    
    fx(3,5,x=1,y=2)

    可以理解为*args获取了所有位置参数,所以x,y必须给定值,否则无法取到值

     *之后的普通参数变为必须给定的keyword-only参数

    def fx(*,x,y):
        print(x,y)
    
    fx(x=1,y=2)

    错误的定义方式

    def fx(**kwargs,x,y):
        print(x,y)
        print(kwargs)

    可以理解为kwargs已经获取了所有的关键字参数,x,y就无法获取值了

    注意:形参的顺序(位置参数,缺省值,可变位置参数,keyword-only参数(可以带有缺省值),可变关键字参数)

    def fx(x,y,z=5,*args,**kwargs):
        print(x,y,z)
        print(args)
        print(kwargs)
    
    x = fx(1,4,3,1,2,a=1, b=2, c=3)

    运行结果

    1 4 3
    (1, 2)
    {'b': 2, 'a': 1, 'c': 3}

    错误的定义方式

    def fx(*args,x,y,**kwargs):
        print(x,y)
        print(args)
        print(kwargs)
    
    x = fx(1,4,3,1,2,a=1, b=2, c=3)

    运行结果

      File "C:/Users/ASUS-PC/PycharmProjects/zhanghao/复习/生成器.py", line 36, in <module>
        x = fx(1,4,3,1,2,a=1, b=2, c=3)
    TypeError: fx() missing 2 required keyword-only arguments: 'x' and 'y'

     Python函数的嵌套

    在一个函数内层定义了另外一个函数

    def outer():
        def inner():
            print('inner')
        print('outer')
    
    outer()

    运行结果

    outer

    当直接调用内层函数inner时会报错

    def outer():
        def inner():
            print('inner')
        print('outer')
    
    outer()
    inner()

    运行结果

    outer
      File "C:/Users/ASUS-PC/PycharmProjects/生成器.py", line 67, in <module>
        inner()
    NameError: name 'inner' is not defined

    内层函数需要在定义的时候调用

    def outer():
        def inner():
            print('inner')
    
        print('outer')
        inner()
    
    
    outer()

    运行结果

    outer
    inner
  • 相关阅读:
    javap -c 字节码含义
    redis --- lua 脚本实现原子操作
    感想
    AbstractAdvisingBeanPostProcessor---spring aop 处理器
    spring 自定义解析类
    protobuf3 语法解析
    Java设计模式之builder模式
    工厂和抽象工厂模式
    RESTful入门
    RocketMQ入门
  • 原文地址:https://www.cnblogs.com/zh-dream/p/13768819.html
Copyright © 2011-2022 走看看