函数的基础概念:
  函数是python为了代码最大程度地重用和最小化代码冗余而提供的基本结构
  函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件
  函数用于将相关功能打包并参数化
  在python中可以创建4种函数
    (1)全局函数:定义在模块
    (2)局部函数:嵌套于其它函数中
    (3)lambda函数:表达式,如需多次调用
    (4)方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
  python提供了很多内置函数


创建函数:

def functionName(arg1,arg2,...):
  suite
   return 

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

一些相关的概念:
  def是一个可执行语句
    因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,例如if或while中
  def创建了一个对象并将其赋值给一个变量名(即函数名),函数体则存在内存
  return用于返回结果对象,其为可选;无return语句的函数自动返回None对象
    返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象
    函数一旦执行到return,函数就终止了,如果return下面还有执行语句则终止
  def语句运行之后,可以在程序中通过函数后附加()进行调用

函数作用域:
  python创建、改变或查找变量名都是在名称空间中进行
  在代码中变量名被赋值的位置决定了其能被访问到的范围
  函数定义了本地作用域,而模块定义了全局作用域

    1.全局变量全部用大写表示
    2.全局变量都可以被访问,函数内部的变量则为本地作用域
    3.在函数内如果要修改全局变量,需要global
    4.特殊:字典,列表可以在函数内修改,但是不能重新赋值

更多作用域

NAME = 'tomcat'

def f1():
    age = 18
    global NAME
    NAME = 'xiao'
    print(age,NAME)

def f2():
    age = 27
    print(age,NAME)

f1()
f2()

函数的参数:
  默认情况下,参数通过其位置进行传递,从左至右,这意味着,必须精确地传递和函数头部参数一样多的参数
  但也可以通过关键字参数、默认参数或参数容器等改变这种机制
    (1)普通参数:定义函数时从左至右
    (2)默认参数:定义函数时是使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
    (3)指定参数:调用函数时指定"name形式参数=value实际参数"的语法通过参数名进行匹配
    (4)动态参数:定义函数时形式参数中收集任意多基于普通参数
      定义函数时使用* :收集普通参数,返回元组,*args
      定义函数时使用**:收集指定参数,返回列表,**kwargs
    (5)动态参数解包:调用函数时,使用**开头的参数,从而传递任意多基于普通或指定参数

注意:定义函数时
  1.混用普通参数和默认参数,应当把默认参数写到右侧
  2.混用有默认和无默认值的参数时,无默认值放左侧

 

1、返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

以上要点中,比较重要有参数和返回值:

def 发送短信():
       
    发送短信的代码...
   
    if 发送成功:
        return True
    else:
        return False
   
while True:
       
    # 每次执行发送短信函数,都会将返回值自动赋值给result
    # 之后,可以根据result来写日志,或重发等操作
   
    result = 发送短信()
    if result == False:
        记录日志,短信发送失败...

2、参数

没有参数的情况

#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
1.需要开启邮箱服务sendmail
2.邮箱服务器需要开启SMTP服务
'''

def sendmail():
    try:
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr

        msg = MIMEText('邮件内容', 'plain', 'utf-8')
        msg['From'] = formataddr(["发件人", 'pythonxiao@126.com'])
        msg['To'] = formataddr(["收件人", '329275108@qq.com'])
        msg['Subject'] = "邮件主题"

        server = smtplib.SMTP("smtp.126.com", 25)
        server.login("pythonxiao@126.com", "xiaozhiqi2016")
        server.sendmail('pythonxiao@126.com', ['329275108@qq.com', ], msg.as_string())
        server.quit()
    except:
        return False
    else:
        return True

ret = sendmail()
if ret == True:
    print("发送成功")
else:
    print("发送失败")

有参数的情况:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def sendmail(email,content):
    try:
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr

        msg = MIMEText(content, 'plain', 'utf-8')
        msg['From'] = formataddr(["发件人", 'pythonxiao@126.com'])
        msg['To'] = formataddr(["收件人", '329275108@qq.com'])
        msg['Subject'] = "邮件主题"

        server = smtplib.SMTP("smtp.126.com", 25)
        server.login("pythonxiao@126.com", "xiaozhiqi2016")
        server.sendmail('pythonxiao@126.com', [email, ], msg.as_string())
        server.quit()
    except:
        return "失败"
    else:
        return 'cc'

while True:
    msg = input("请输入邮箱地址:")

    #实际参数
    ret = sendmail(msg,"SB")
    if ret == 'cc':
        print("发送成功")
        break
    else:
        print("发送失败")

从上面例子可以看出有参数的函数表现的非常灵活可扩展!

函数的有三中不同的参数(定义函数时):

  • 普通参数
  • 默认参数
  • 动态参数

  指定参数和动态参数解包是发生在调用函数

(1)# xxoo为普通参数也叫形式参数,简称:形参
def f1(name):
    print(name)

# 'test' 叫做函数的实际参数,简称:实参
f1('tomcat')
普通参数

相关文章:

  • 2021-06-16
  • 2022-12-23
  • 2022-02-07
  • 2022-02-01
  • 2021-11-26
  • 2022-02-06
  • 2021-05-31
  • 2021-06-10
猜你喜欢
  • 2021-09-05
  • 2021-09-26
  • 2022-12-23
  • 2021-12-15
  • 2022-12-23
  • 2021-07-23
相关资源
相似解决方案