• 自学Python3.1-函数基础


    自学Python之路-Python基础+模块+面向对象
    自学Python之路-Python网络编程
    自学Python之路-Python并发编程+数据库+前端
    自学Python之路-django

    一、函数概述

    1. 简介

      函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率

    2. 组成

    • 函数代码块以 def 关键词开头,后接函数名和圆括号()
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数主体部分:函数内容以冒号起始,并且缩进。
    • 函数结束部分:return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
    def functioname函数名(parameters参数)
         " 文档字符串 "
         函数体
         return()返回值

    3. 简单调用

      以上边的示例为例,调用方法很简单执行如下代码。

             functionname(参数) 

      注意,函数定义好之后,并不会运行。只有在调用的时候会运行

    def cal():
        n=123
        n+=1
        print(n)
    cal() #执行函数
    c=cal # 变量C指向函数cal
    c() # 同cal()一样
    

    输出

    124
    124

    二、函数组成部分

    2.1 函数的命名

      函数名应该为小写,可以用下划线风格单词以增加可读性。如:myfunction,my_example_function。

           Python之父Guido推荐的命名规范包括如下几点:
               ①模块名和包名采用小写字母并且以下划线分隔单词的形式;
               ②类名采用以大写字母开头,并且以大写字母分隔单词的形式命名;
               ③全局或者类常量,全部使用大写字母,并且以下划线分隔单词;其余变量命名则是采用全部小写字母,并且以下划线分隔单词的形式命名。
               ④以上的内容如果是内部的,则使用下划线开头命名。

    2.2 函数参数

          形参:def函数后面的变量,()内的变量
          实参:调用函数时候用的值,也叫参数

    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    def mail(user):
        ret=True
        try:
           msg = MIMEText('邮件内容', 'plain', 'utf-8')
           msg['From'] = formataddr(["carlos", 'carlos@126.com'])
           msg['To'] = formataddr(["carlos_chiang", user])
           msg['Subject'] = "主题"
           server = smtplib.SMTP("smtp.126.com", 25)
           server.login("carlos@126.com", "邮箱密码")
           server.sendmail('carlos@126.com', [user, ], msg.as_string())
           server.quit()
        except Exception:
            ret=False
        return ret
    ret=mail('422417945@qq.com')
    ret=mail('422417946@qq.com')
    ret=mail('422417947@qq.com')
    if ret:
        print('发送成功')
    else:
        print('发送失败')
    

    通过定义参数,可以给3个人发送邮件,简化了代码。

    参数如何使用?
    ①无参数def  show():
                   show()

    ②一个参数def show(arg)
                     show('aaaa')

    ③二个参数def show(arg,chr)
                     show('aaaa','bbbbb')         (若只赋值一个参数,会报错)

       .......

    函数的参数分为三类:默认参数、指定参数、可变参数

    2.2.1 默认参数    必须放置在最后

    1. 在函数中默认参数赋值a, 在函数外若该参数无赋值,将直接采用赋值a ;

    2. 在函数中默认参数赋值a,在函数外若该参数赋值b,将采用赋值b

    def show(a,b=100): # 默认参数b=100       这种写法错误def show(a=111,b):
         print(a,b)
    show(200) # 只有一个赋值,默认是给第一个赋值

    输出200 100

    def show(a,b=100): 
        print(a,b)
    show(200,300)
    

    输出200 300

    2.2.2 指定参数

    def functionname(name,age=18):
       print("I'm %s, age %s" % (name, age))
    functionname(age=26,name="carlos")  #上述默认age参数为18,如果这里不指定age的话,默认会使用18,但是如果我们指定参数的话,优先会执行我们指定的参数值。
    

     输出 I'm carlos, age 26 

    2.2.3 可变参数

    2.2.3.1 可变参数 *    把所有赋值的参数变成元素

    举例1

    def function_name(*args):
         print(args, type(args))
    function_name(1)
    function_name(1,2,3)
    

    输出

    (1,) <class 'tuple'>
    (1, 2, 3) <class 'tuple'>

    由此可以看出,默认将传入的参数,全部放在元组中,即args = (...),在执行()的时候,会进行tuple.__init__方法。

    举例2

    def function_name(*args):
         print(args, type(args))
    function_name(1,2,3)
    function_name(*'wzg')
    function_name(*['jack','tony'])
    

    从此可以看出,可以看出带*的参数,会循环变量中的每个元素加入至tuple中。字符串的话循环每个字母。如果传入的是个列表或者元组,返回的是列表,元组中的每个元素。class类型都是作为'tuple'返回。

    举例3

    def function_name(*args):
        for name in args:
            print(name,type(name))
    function_name('liupeng','jack',11,22,['a','b','c'])
    

    输出

    liupeng <class 'str'>
    jack <class 'str'>
    11 <class 'int'>
    22 <class 'int'>
    ['a', 'b', 'c'] <class 'list'>

    基于*args案例的基础上添加了for循环语句,循环的是args中的每个元素并显示元素的类型。从上例可以看出*接收的不光可以是一个字符串,还可以是数字或者列表。

    2.2.3.2 可变参数 **   把所有赋值的参数变成字典, 参数的格式必须是有key value
    举例1

    def function_name(**args):
        print(args,type(args))
    function_name(name = 'wzg',job = "IT")  #key1=name value=wzg  key2=job value=IT
    

    输出
    {'name': 'wzg', 'job': 'IT'} <class 'dict'>
    举例2

    dic = {'k1':'v1','k2':'v2'}
    def function_name(**dic):
        print(dic)
    function_name(**dic)
    

    输出
    {'k1': 'v1', 'k2': 'v2'}  

    举例3

    dic = {'k1':'v1','k2':'v2'}
    def function_name(**dic):
        print(dic)
    function_name(di=dic)
    

    输出
    {'di': {'k1': 'v1', 'k2': 'v2'}}

    分析以上3个例子的结果:

    ①函数本身不用多说,当我们在第一次调用函数时因为参数我们指定了(name跟job的)参数因此打印时候直接输出了字典keys为name跟job,values为wzg,IT即 {'name': 'wzg', 'job': 'IT'} <class 'dict'>。

    ②在第二次调用函数时,会发现我们这次调用函数()中传的参数也是**的方式。这里提前创建了一个dic的字典并把它作为函数的参数使用。结合**的用法,使得字典中每个元素作为参数传到函数中被调用。

        即{'k2': 'v2', 'k1': 'v1'} <class 'dict'>。

    ③最后一次调用函数时,我们参数是这么指定的(di = dic),这里可以看出跟1的使用方法相同。对了,没错。这次只不过是我们把整个dic作为了字典中的values来传入函数了而di做为了字典中的key。即

     {'di': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>

    总结:上面1-3不管那一种的类型最终都是<class 'dict'>也就是说**args,或者**其他什么变量最终生成的结果都是以字典的方式呈现。而*args最终都是以元组的方式呈现。

    2.2.3.3 可变参数  *   **   (两个一起使用)
        ①必须* 在前  ,**在后
        ②赋值的时候必须元组在前,字典在后

    def show(*args,**kwargs):
        print(args,type(args))
        print(kwargs,type(kwargs))
    show(11,22,33,44,n1=88,carlos='boy')
    
    def show(*args,**kwargs):
        print(args,type(args))
        print(kwargs,type(kwargs))
    i=[11,22,33,44]
    j={'n1':88,'carlos':'boy'}
    show(*i,**j)
    

    以上均输出

    (11, 22, 33, 44) <class 'tuple'>
    {'n1': 88, 'carlos': 'boy'} <class 'dict'>

    def show(*args,**kwargs):
        print(args,type(args))
        print(kwargs,type(kwargs))
    i=[11,22,33,44]
    j={'n1':88,'carlos':'boy'}   #如果这样定义,相当于将i,j都放到args中,结果导致kwargs 字典为空
    show(i,j)
    

    输出

    ([11, 22, 33, 44], {'n1': 88, 'carlos': 'boy'}) <class 'tuple'>
    {} <class 'dict'>  

    2.3 函数注释

      Python有一种独一无二的的注释方式: 使用文档字符串. 文档字符串是包, 模块, 类或函数里的第一个语句.。这些字符串可以通过对象的__doc__成员被自动提取, 并且被pydoc所用。
           
         函数注释包含以下几个部分:

      1.整体功能说明  2.输入参数说明  3.输出/返回值说明  4.异常说明  5.其他

    2.4 函数主体

      函数主体部分就是代码逻辑的实现/处理过程。

    2.5 函数返回值

      ①函数返回值是一个可选的选项,可以返回一个表达式、某种数据结构等
           ②默认返回None输出

    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    def mail():
        ret=True
        try:
           msg = MIMEText('邮件内容', 'plain', 'utf-8')
           msg['From'] = formataddr(["carlos", 'carlos@126.com'])
           msg['To'] = formataddr(["carlos_chiang", '422417945@qq.com'])
           msg['Subject'] = "主题"
           server = smtplib.SMTP("smtp.126.com", 25)
           server.login("carlos@126.com", "邮箱密码")
           server.sendmail('carlos@126.com', ['422417945@qq.com', ], msg.as_string())
           server.quit()
        except Exception:
            ret=False
        return ret
    ret=mail()
    print(ret)

    输出

    False         (原因为‘邮箱密码’,若输入正确密码,则输出为True)  

    在函数或者类中,若出现return,后续代码不执行。

    def show():
        print('a')
        return([11,22])
        print('b')
    s=show()
    

    输出a

    三、断点调试,查看代码执行顺序

    1. 在左侧设置断点

    2. 如果使用断点,采用debug模式运行

    3. 一步一步执行代码,,单击console查看输出结果

     

  • 相关阅读:
    Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警
    Prometheus 入门教程(一):Prometheus 快速入门
    Prometheus 系列开篇:为什么要学 Prometheus ?
    你总是遗憾,是因为你还没想好,你的一生想怎么过!
    搞 Java 的年薪 40W 是什么水平?
    闪送,为何能从顺丰中杀出一条血路?
    安全攻击溯源思路及案例
    Windows下登录凭证窃取技巧
    Linux下登录凭证窃取技巧
    如何探测内网存活主机
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/7416240.html
Copyright © 2020-2023  润新知