zoukankan      html  css  js  c++  java
  • 函数基础

    一.函数的定义

    在编程的过程中,会出现代码冗余,可读性差,不易修改,所以出现了函数,函数类似一个工具,这个工具可以拿过来直接使用

    def 函数名(形参1,形参2...):
      '''函数的注释,描述函数的作用以及参数的类型'''   代码块   ...   
    return # return可以获取函数执行后的返回值,也可以结束函数的运行

    1.函数名的定义类似变量名
    2.函数名加括号立即执行函数体代码 优先级最高
    3.函数必须先定义再调用

    func(10,20)  # 报错,因为函数必须先 定义 在 引用(调用)
    def func(x,y):  # 定义函数
        if x > y:
            print(x)  # return x  返回值 x
        else:
            print(y)  # return y  返回值 y
    func(2,5)  # >>> 5  函数名加括号立即执行函数体代码
    res = func(2,5)
    print(res)   # 返回值 None
    print(func)  # <function func at 0x0000027893BE2EA0> func 对应的是函数的内存地址

    二.return 函数的返回值

    1.不写return 
    2.只写return
    3.return None
    4.return 返回一个值
    5.return 返回多个值

    不写 return 返回值 None
    def func():
        print('waller')
    func()  # >>> waller
    res = func()  # 定义变量接收给返回值
    print(res)  # >>> None
    
    
     只写 return 返回值 None 除此之外还可以结束函数的运行
    def func():
        l = [1,2,3]
        while True:
            for i in l:
                if i == 2:  # 当 i == 2 时结束整个循环需要两个break,分别结束for和while
                    #break
                    return  # 函数里的return可以结束整个函数,之后的代码永远不执行
                print(i)
                # else:
                #     print(i)
            # break
    
    res = func()
    print(res)  # >>> None

    只写 return None
    ef func():
        return None
    res = func()
    print(res)  # >>> None
    
    
    return 返回一个值,这个值可以是任意类型
    def func1():
        return 123
    def func2():
        return 'waller'
    def func3():
        return [1,'age']
    def func4():
        return (1,)
    def func5():
        return {'hubby':'read'}
    def func6():
        return {1,}
    def func7():
        return True
    print(func1(),func2(),func3(),func4(),func5(),func6(),func7())
    # >>> 123 waller [1, 'age'] (1,) {'hubby': 'read'} {1} True
    
    
    return 返回多个值 返回的时一个元组,函数处理的结果不想被修改
    def func1():
        return 1,2,3,'a','b'
    res1 = func1()
    print(res1)  # >>> (1, 2, 3, 'a', 'b')
    
    def func2():
        return [1,2],['a',1]
    res2 = func2()
    print(res2)  # >>> ([1, 2], ['a', 1])
    
    def func3():
        return {'name':'waller'},{'age':20}
    res3 = func3()
    print(res3)  # >>> ({'name': 'waller'}, {'age': 20})
    
    # 返回多个值,不想函数处理成元组,可以自己动手加上数据类型符号,使多个值变成一个值
    def func4():
        return [{'name':'waller'},{'age':20}]  # 利用return打印一个值的特点
    res4 = func4()
    print(res4)  # [{'name': 'waller'}, {'age': 20}]

    注意:

    1.所有的函数都有返回值
    2.只写return 或return None 不是为了返回值,是为了结束函数的运行

    三.参数:

    参数的两大类型:
    形参:在函数定义阶段括号内的参数,这个形参相当于变量名,简称 形参
    实参:在函数调用截断括号内的参数,这个参数相当于变量值,简称 实参

    形参与实参的关系:
    形参相当于变量名,实参相当于变量值
    函数调用传参的阶段,就是实参变量值给形参变量名赋值的过程

    注意:
    形参和实参的绑定关系只有在函数调用阶段生效,函数运行完自动解除绑定关系
    只有在函数内部有效,函数外部无影响
    def func(x,y):
        '''
        函数的作用以及参数的类型
        :param x:
        :param y:
        :return:
        '''
        print('waller')
        return  'wong'
    print(help(func))  # 打印出函数的注释

     传参:

    位置传参
    位置形参:在函数定义阶段,括号内从左到右依次写入的变量名较叫位置形参,调用时必须为其传值
    位置实参:在函数调用阶段,对应位置形参依次在括号内填入的值,这些值会一一传给形参(类似变量名赋值)
    关键字传参
    在函数调用阶段,按照形参的变量名 赋值

    注意:
    位置传参和关键字传参和混合使用,但关键字传参要在位置传参的后面
       同一个参数不能被多次赋值

     位置传参:
    def num_max(x,y):  # x,y 是位置形参,需要传值
        if x > y:
            return x  # 若x > y 返回值是 x
        else:
            return y  # 否则 返回值是 y
    res = num_max(2,6)  # 2和6 是位置实参,按照x与y的位置传递参数 x = 2,y = 6
    print(res)  # 打印函数的返回值  >>> 6
    
    res = num_max(5)  # 报错 ,位置实参传参个数少于形参数
    res = num_max(2,6,7)  # 报错,位置实参传参个数多余形参数
    
    
    关键字传参:
    def num_max(x,y):  # x,y 是位置形参,需要传值
        if x > y:
            return x  # 若x > y 返回值是 x
        else:
            return y  # 否则 返回值是 y
    res = num_max(y=6,x=2)  # 按关键字为形参传参
    print(res)  # >>> 6
    res = num_max(y=6,x=2,x=1)  # 报错,同一个形参不能被多次传值
    
    res = num_max(2,y=6)  # 位置参数和关键字参数同时使用
    res = num_max(y=6,2)  # 报错,关键字参数要在位置参数后面
    默认参数:
    定义:
    在函数定义阶段,形参(变量名)就已经被赋值了

    在调用阶段,可以不为默认形参传值,默认使用定义阶段绑定的值
    在调用阶段,如果为默认形参传值,就使用调用阶段传入的值

    注意:
    定义阶段,默认形参要在位置形参的后面

    应用场景:
    当形参接收的值大多数是相同值的情况下,可以使用默认形参
    
    
    def num_max(x,y=100):
        if x > y:
            return x
        return y
    res = num_max(50)  # x = 50 y = 100  # 传入位置参数 50给形参x,形参y不传值,使用默认参数
    print(res)  # >>> 100
    
    res1 = num_max(50,20)  # x = 50 y = 20  # 传入位置参数 50给形参x,20给形参y
    print(res)  # >>> 50
    
    
    def info(name,age,gender = 'male'):  # gender = 'male' 是默认参数
        print('name is {},age is {},gender is {}'.format(name,age,gender))
    info('waller',20)  # >>> name is waller,age is 20,gender is male
    info('wong',24)  # >>> name is wong,age is 24,gender is male
    info('tuan',22,'female')  # >>> name is tuan,age is 22,gender is female
    
    
    可变长参数 *和**
    形参中的 * 可以将实参中多余的位置参数组成元组的形式赋值给形参中*后面的变量名,不能接收关键字实参
    实参中的 * 可以将实参中除字典的容器类型数据打散,依次赋值给形参

    形参中的 ** 可以将实参中多余的key=value的关键字形式实参存成字典的形式 赋值给形参中** 后面的变量名,不能接收其他容器类型的实参(俗称封装)
    实参中的 ** 会将实参中的字典类型数据,按照key=value的关键字传参的形式赋值给形参(俗称打散)
    python 推荐*和**写法:
    def func(*args,**kwargs):  # 调用者按照正确的传参方式无论怎么传都可以接受
        print(args,kwargs)

    形参中的 *
    def func(x,y,*z):
        print(x,y,z)
    func(1,2,3,4,5,6,)  # >>> 1 2 (3, 4, 5, 6)  z = (3, 4, 5, 6)

    实参中的 *
    
    
    def func(x,y,z):
        print(x,y,z)
    func(*[1,2,3,])  # >>> 1 2 3
    
    def func(x,y,z):
        print(x,y,z)
    func(*('a','b',1))  # >>> a b 1
    
    def func(x,y,z):
        print(x,y,z)
    func(*{'a',(1,2),5})
    
    def func(x,y,*z):
        print(x,y,z)
    func('a',5,*[1,2,3])  # a 5 (1, 2, 3)
    
    
    形参中 ** 
    ef func(x,**y):
        print(x,y)
    func(x='a',y='b',z='c',d=1,e=2)  # y = {'y': 'b', 'z': 'c', 'd': 1, 'e': 2}
    # >>> a {'y': 'b', 'z': 'c', 'd': 1, 'e': 2}
    实参中的 ** 
    def func(x,y):
        print(x,y)
    
    d = {'x':'waller','y':20}
    func(**d)

  • 相关阅读:
    ObjectC----NSObject常用方法和OC反射机制
    自定义 URL Scheme 完全指南
    一文让你彻底了解iOS字体相关知识
    Objective-C Category 的实现原理[转]
    Objective-C Autorelease Pool 的实现原理[转]
    eclipse无法连接到makertplace
    logstash日志分析的配置和使用
    在CentOS或RHEL防火墙上开启端口
    redhat7下配置tomcat7,更改端口8080后无法访问页面
    Uiautomatorviewer报错:Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException
  • 原文地址:https://www.cnblogs.com/waller/p/11159811.html
Copyright © 2011-2022 走看看