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

    函数的定义:
    def 函数名():
      pass

    def my_len():
      ls = [1,2,3,4,11,18]
      for count in ls:
        count += 1
      print(count)
    函数的调用方法:
    函数名() # 执行函数 函数名()

    函数的优点:
    减少代码的重复率;
    增强代码的阅读性。

    函数到底是什么?函数最主要的目的:封闭一个功能。


    函数的返回值: 要用到 return 语句
    # 函数的声明: def 函数名():
    def my_len():      # 这个函数没有返回值
        ls = [1,2,3,4,11,18]
        for count in ls:
            count += 1
        print(count)
    my_len()
    result = my_len()  # 函数没有返回值,用一个变量去接收结果,就是:None
    print(result)   # 输出结果: None
    
    # 要让函数返回址,就要用到 return 语句, return 值  ;若没有,没有跟值 ,返回值 也是 None
    
    # return 后面没有跟值的情况:
    def demo1():
        a = 5
        return
    print(demo1())   # None
    
    # return 后面跟一个值 的 情况:
    def demo2():
        a = 5
        return a
    result = demo2()
    print(result,type(result))  # 5 <class 'int'>
    
    def demo3():
        tu = (1,3,'abc')
        return tu
    result = demo3()
    print(result,type(result))  # (1, 3, 'abc') <class 'tuple'>
    # return 后面跟一个值的情况总结:值是什么类型,返回也相应的类型。即原封不动地返回。
    
    # return 后面跟多个值的情况: 值 与 值 之间以‘逗号’分割
    
    def demo4():
        x = 5
        y = 'hello world'
        dic = {'name':'chris'}
        return x,y,dic
    ret = demo4()  # 整体是函数的执行者。在工作中,函数中尽量不要出现print
    print(ret,type(ret))   #  (5, 'hello world', {'name': 'chris'}) <class 'tuple'>
    
    # 可见,如果return 返回多个值的情况,将return 后面的值,放进一个元组,整个返回
    
    # 由于返回的是一个元组,可以分别赋值
    x,y,dic = demo4()   # 分别赋值时, = 号两边的元素个数相同,一一对应
    print(x,y,dic)      # 5 hello world {'name': 'chris'}

     函数的参数:

    # 函数的传参:
    # 实参
    #       位置参数:   按照顺序,一一对应
    #       关键字参数: 可以不按照顺序,但是必须一一对应
    #       混合参数: 关键字参数一定要在位置参数后面
    # 形参
    #       位置参数:按照顺序,一一对应
    #       默认参数:
    l1 = [1,3,5,7,9,11]
    s = "jump river haha"
    def obj_len(argv):  # 形式参数,形参
        # 函数体
        count = 0
        for item in argv:
            count += 1
        return count
    length = obj_len(l1)  # 函数的执行者(实参) 实际的参数
    print(length)  # 6
    length = obj_len(s)    # 函数的执行者(实参) 实际的参数
    print(length)  # 15
    
    #实参 之 位置参数:
    
    def func1(x,y):
        print(x,y)
    func1(1,2)   #  通过位置传参数,一一对应, 1 传给形参 x , 2 传给形参 y.
    # 2个函数,1个函数 求和;2个函数 将大的数给我返回
    def sum1(x,y):
        return x + y
    a = 10
    b = 15
    print(sum1(a,b))
    
    def compare(x,y):
        return x if x > y else y    # 三目运算符
    x = 3
    y = 2001
    print(compare(x,y))
    # 三元运算符:只针对简单的if else 这样的结构,才可以使用。
    
    # 关键字参数,可以不按照顺序,但是必须一一对应。
    def func2(x,y):
        return x == y           # return后面,可以是关系表达式,但不能是赋值表达式
    print(func2(y=10,x=7))
    
    # 混合传参: 关键字参数一定要在位置参数后面。
    # def func3(a,y,n,x,n):    # 在函数的定义中,不能有相同的参数 SyntaxError: duplicate argument 'n' in function definition
    #     return a,y,x,n
    # name = 'chris'
    # print(func3(100,200,'chris',x=18,n=28))
    
    # def func3(a,y,n,x,n1):
    #     return a,y,x,n
    # name = 'chris'
    # print(func3(100,200,'chris',x=18,n1=28))
    
    # 形参角度
    #       位置参数:按照顺序,一一对应
    #       默认参数: 给其传值,将原来默认值给覆盖掉,不传值,不报错,使用默认值
    #                   应用场景:不经常改变的参数,但是一直在用。
    def func4(x,y,z=100):
        return x, y, z
    print(func4(10,20)) # (10,20,100)
    print(func4(10,20,150)) # (10,20,150)

     形参中的 默认参数:

    # def test(x,y=15,z):    # 报错:SyntaxError: non-default argument follows default argument
    #     print(x,y,z)
    # test(10,z=18)
    
    # 经过测试,总结出来,在函数定义时,形参中的默认参数,要放在最后,即非默认参数,不能跟随在默认参数后面
    def test(x,z,y=15):    # 报错:SyntaxError: non-default argument follows default argument
        print(x,y,z)
    test(10,y=15,z=18)  # 打印10 15 18
    
    def test(x,y=15,z=10):    # 报错:SyntaxError: non-default argument follows default argument
        print(x,y,z)
    test(10,z=18)   # 打印10 15 18
    
    def test(x,y=15,z=10):    # 报错:SyntaxError: non-default argument follows default argument
        print(x,y,z)
    test(10,18)  # 打印 10 18 10

     形参中的默认参数陷井:

    # 形参中的默认参数陷井
    
    def trap(arg1,arg2=[]):
        arg2.append(arg1)
        return arg2
    ret1 = trap(15)
    ret2 = trap(100)
    ret3 = trap(101)
    print(ret3)  # [15,100,101]
    print(id(ret1),id(ret2),id(ret3))   # 指向同一个内存地址 2196520805000 2196520805000 2196520805000
    # 总结: 当默认参数是可变数据类型时,她始终使用一个

    写一个不函数:输入学生信息:

    def add_record(name,sex):
        with open('students',encoding='utf-8',mode='a+') as f1:
            f1.write(name + "----" + sex + '
    ')
            print("{}-----{} 添加成功".format(name,sex))
            f1.close()
    
    print("欢迎来到学生信息录入系统!!!")
    while 1:
        select = input("请输入,任意键继续,Q退出>>>")
    # 为了做兼容性,怕用记输入中文的逗号,对接收的字符串作一个替换操作,变为英文的逗号,再以逗号 分割,得到一个列表
        if select.upper() != 'Q':
            name,sex = input("请输入学生的姓名和性别,以逗号作为分割>>>").strip().replace('',",").split(",")
            add_record(name,sex)
        else:
            break
    动态参数,也叫万能参数:
    # 你的函数为了拓展,对于传入的实参数量不固定,这时就要用万能参数,又叫动态参数, *args, **kwargs.
    def function1( *args,**kwargs):
        print(args)
        print(kwargs)
    function1(1,3,[1,3,5],x=10,y=20,name='chris')   #  (1, 3, [1, 3, 5])
                                                    # {'x': 10, 'y': 20, 'name': 'chris'}
    
     # 总结一下:在函数定义中,万能参数或叫动态参数   一颗星 或 二颗星 后面的 变量名字,可以任意取,
     # 只不过,给定俗成取为 args  和  kwargs 。
     # 在函数的定义中, 形参中的 星号  是 聚合 的作用。
     #   一颗星 将函数调用时,实参中的所有位置参数 ,聚合到一个元组中,然后将该 元组 赋值给 一颗星 后面的变量名
     #   二颗星 的作用 是在函数调用时,将实参中的关键字参数,以键值对的形式,聚合到字典中,然后将字典赋值给 二颗星 后面的 变量名
    
     # * 号的魔法作用,在函数调用时, * 的作用是 打散   的作用
    一颗星 * 把迭代对象打散成为 实参中的位置参数 ; 二颗星 ** 把字典 打散成 实参中的 关键字参数
    l1 = [1,2,3,5] l2 = [11,22,33,'chris'] def func1(*args): return args[0] + args[1] print(func1(l1,l2)) # [1, 2, 3, 5, 11, 22, 33, 'chris'] def func1(*args): # 定义一个聚合实参的位置参数的变量 return args print(func1(*l1,*l2)) # (1, 2, 3, 5, 11, 22, 33, 'chris') # 这里 * 号起到打散的作用,将可迭代对象,打散成一个个元素5 # 相当于 func1(1,2,3,5,11,22,33,'chris') l3 = [[1,2,{'name':'chris'}],99,88] print(func1(*l3)) # ([1, 2, {'name': 'chris'}], 99, 88) 只是将第一层打散 dic = {'name':'chris','age':18,'sex':'male'} print(func1(*dic)) # ('name', 'age', 'sex') 一颗星 ,对字典打散,打散成一个个键 def func2(**kwargs): print(kwargs) dic = {'name':'chris','age':18,'sex':'male'} func2(**dic) # 函数调用时, 二颗星,将后面字典中的键值对,打散成关键字参数传参 # 相当于 func2(name='chris',age=18,sex='male) func2(name='chris',age=18,sex='male') func2(*dic) # 报错: TypeError: func2() takes 0 positional arguments but 3 were given
    
    
    
    形参的顺序:
    # 位置参数,默认参数,*args,**kwargs
    
    # 位置参数,默认参数
    # def func(a,b,sex='男'):
    #     # print(a)
    #     print(sex)
    # func(100,200,)
    # 位置参数,*args, 默认参数
    # def func(a,b,*args,sex='男',):
    #     # print(a)
    #     print(a,b)
    #     print(sex)
    #     print(args)
    # func(100,200,1,2,34,5,6)
    
    # 位置参数,*args, 默认参数 **kwargs
    # def func(a,b,*args,sex='男',**kwargs,):
    #     print(a,b)
    #     print(sex)
    #     print(args)
    #     print(kwargs)
    # func(100,200,1,2,34,5,6,sex='nv',name='alex',age=1000)

    =========================================================================================================
    def test(x,y,z=10,**kwargs):
    print(x)
    print(y)
    print(z)
    print(kwargs)
    test(11,22,name='jia',age=18)


    def test(x,y,**kwargs,): # 两颗星 修饰的 聚合变量 放到形参最后,规则
    print(x)
    print(y)

    print(kwargs)
    test(11,22,name='jia',age=18)


    
    
    

































    def test(x,z,y=100): # 函数定义时,默认参数放在最后
    return x + y + z
    #print(test(100,2)) # SyntaxError: non-default argument follows default argument 非默认参数不能跟随默认参数后
    print(test(x=100,z=100))
    print(test(100,200))
  • 相关阅读:
    最快速的Android开发环境搭建ADT-Bundle及Hello World
    android sdk manager 无法更新解决方法
    ADO.NET 新特性之SqlBulkCopy
    WCF错误:413 Request Entity Too Large
    构建高性能的ASP.NET应用程序
    编写高性能Web应用程序的10个技巧
    很不错的jQuery学习资料和实例
    学习jQuery之旅
    50个常用的JQuery代码
    机器学习瓶颈
  • 原文地址:https://www.cnblogs.com/chris-jia/p/9480677.html
Copyright © 2011-2022 走看看