zoukankan      html  css  js  c++  java
  • Python基础之函数与装饰器

    阅读目录

    一、为什么要使用函数

    二、函数的定义与调用

    三、函数返回值

    四、函数的参数

    五、本章小结

    六、装饰器

    一、函数流程图:

      

      函数名的命名规则:

      1、函数名必须由字母下划线数字组成,不能是关键字和数字开头

    2、函数名还是要有一定的意义能够简单说明函数的功能

      初识函数定义:

      新建一个mylen的函数

    def mylen():
        '''计算S1 的长度'''
        s1 = 'hello world'
        length = 0
        for i in s1:
            length = length + 1
        print(length)    

      初识函数调用:  

      通过调用mylen的函数,实现计算hello word的长度。

    str_len = mylen()
    print('str_len:%s'%str_len)

      以上代码也只是完成调用,但是函数体内并没有返回值,所以调用为None,使用return关键字返回结果。代码如下: 

        return length   #将函数体内的值赋给mylen
    str_len = mylen()
    print('str_len:%s'%str_len)

      return关键字的作用:

      return是一个关键字,在pycharm里会高亮显示。

    函数体内不写return的情况下,会默认返回一个None,需要注意的是return和返回值之间要由一个空格,return可以返回任意数据类型的值。

    返回多个值: 

    可以返回多个值,会被组织成元祖返回,也可以用多个值来接受。

    函数的参数:

    我们要告诉mylen函数要计算的字符串是谁,这个过程就叫做传递参数,简称传参,我们调用函数的传递这个'hello world'和定义函数时的S1就是参数

    实参与形参:

    我们调用函数时传递的这个'hello world'被称为实际参数,因为这个是要实际交歌函数的内容,简称实参

    定义函数时的S1,只是一个变量的名字,被称为形式参数。因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参

    参数传递:

    传递多个参数

    参数可以传递多个,多个参数间用逗号分割。(举例如下)

    def mymax(x,y):
        the_max = x if x > y else y
        return the_max
    
    ma = mymax(10,20)
    print(ma)

      位置参数

      站在实参的角度

      1、按照位置传值  

    def mymax(x,y):
        #此时x=10,y=20
        the_max = x if x > y else y
        return the_max
    
    ma = mymax(10,20)
    print(ma)

      2、按照关键字传值  

    def mymax(x,y):
        #此时x = 20,y = 10
        print(x,y)
        the_max = x if x > y else y
        return the_max
    
    ma = mymax(y = 10,x = 20)
    print(ma)

      3、位置、关键字形式混着用  

    def mymax(x,y):
        #此时x = 10,y = 20
        print(x,y)
        the_max = x if x > y else y
        return the_max
    
    ma = mymax(10,y = 20)
    print(ma)

      正确用法

      问题一:位置参数必须在关键子参数的前面

      问题二:对于一个形参只能赋值一次

      站在形参的角度

      位置参数必须传值  

    def mymax(x,y):
        #此时x = 10,y = 20
        print(x,y)
        the_max = x if x > y else y
        return the_max
    
    #调用mymax不传递参数
    ma = mymax()
    print(ma)
    
    #结果
    TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'

      默认参数

      1、正常使用

        使用方法

        为什么要有默认参数:将变化较小的值设置成默认参数

      2、默认参数的定义  

    def stu_info(name,sex = "male"):
        """打印学生信息函数,由于班中大部分学生都是男生,
            所以设置默认参数sex的默认值为'male'
        """
        print(name,sex)
    stu_info('alex')
    stu_info('eva','female')

      3、参数陷阱:默认参数是一个可变数据类型  

    def defult_param(a,l = []):
        l.append(a)
        print(l)
    
    defult_param('alex')
    defult_param('egon')

      动态参数

        按位置传值多余的参数都由args统一接受,保存成一个元祖的形式  

    def mysum(*args):
        the_sum = 0
        for i in args:
            the_sum+=i
        return the_sum
    
    the_sum = mysum(1,2,3,4)
    print(the_sum)
    def stu_info(**kwargs):
        print(kwargs)
        print(kwargs['name'],kwargs['sex'])
    
    stu_info(name = 'alex',sex = 'male')

      本章小结

    面向过程编程的问题:代码冗余、可读性差、可扩展性差(不易修改)

    定义函数的规则:

     

    1.定义:def 关键词开头,空格之后接函数名称和圆括号()。
    2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。
        参数可以定义多个,也可以不定义。
        参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、
        *args、默认参数、**kwargs顺序定义。     如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序 3.注释:函数的第一行语句应该添加注释。 4.函数体:函数内容以冒号起始,并且缩进。 5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None def 函数名(参数1,参数2,*args,默认参数,**kwargs): """注释:函数功能和参数说明""" 函数体 …… return 返回值

     

      调用函数的规则:

    1.函数名()
        函数名后面+圆括号就是函数的调用。
    2.参数:
        圆括号用来接收参数。
        若传入多个参数:
            应按先位置传值,再按关键字传值
            具体的传入顺序应按照函数定义的参数情况而定
    3.返回值
        如果函数有返回值,还应该定义“变量”接收返回值
        如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致
    
    无返回值的情况:
    函数名()
    
    有返回值的情况:
    变量 = 函数名()
    
    多个变量接收多返回值:
    变量1,变量2,... = 函数名()

     装饰器

    不带参数的装饰器:

    def wrapper(func):
        def inner(*args,**wargs):
            '''函数执行之前代码块'''
            ret=func()
            return ret
            '''函数执行之后代码块'''
        return inner

      带参数的装饰器:

    F = False              #装饰器开关,
    def outer(flag):
        def wrapper(func):
            def inner(*args,**kwargs):
                if flag:
                    print('before')
                    ret = func(*args,**kwargs)
                    print('after')
                else:
                    ret = func(*args, **kwargs)
                return ret
            return inner
        return wrapper

     

     

  • 相关阅读:
    回溯法---哈密顿回路(5)
    回溯法---n皇后问题(4)
    回溯法---n-着色问题(3)
    回溯法--算法框架(2)
    创建二叉树的所有深度上的节点链表
    笔试
    笔试 (2)
    LeetCode278-第一个错误的版本(二分查找)
    LeetCode46-全排列(递归)
    LeetCode258-各位相加(猜想公式)
  • 原文地址:https://www.cnblogs.com/bingpan/p/7236007.html
Copyright © 2011-2022 走看看