7天速成Python——第五天

[7天速成Python——第五天]

各位小伙伴想要博客相关资料的话,关注公众号:chuanyeTry即可领取相关资料!

5 函数

今日概要:函数

1.初识函数

函数到底是个什么?

函数,一大堆代码,给这一堆的代码再起个名字。

# 定义一个函数
def 函数名()://def hanshu():
    print(123)
    print(123)
    print(123)
    print(123)
    ....

# 执行函数(函数内部代码就会执行)
函数名()
def get_info_data():
    print("欢迎使用xxx")
    v1 = 123
    v2 = 567
    v3 = v1 + v3
    if True:
        print(123)
	else:
        print(999)
	print("END")
    
get_info_data()

了解函数是什么了,那么他的应用场景是什么?

  • 面向过程编码:按照业务逻辑从上到下去累代码。

    • 监控系统,监控公司的电脑。

      print("欢迎使用xx监控系统")
      
      if CPU占用率 > 90%:
          发送报警邮件-10if 硬盘使用率 > 95%:
          发送报警邮件-10if 内容使用率 > 98%:
          发送报警邮件-10
    • 棋牌游戏扎金花

      # 1.生成一副扑克牌6行代码
      
      # 2.洗牌3行代码
      
      # 3.给5个玩家发三张牌 15行代码
      
      # 4.玩家手中牌的大小比较(80行)
      	- 是否是豹子(大小)
          - 是否是同花顺(大小)
          - 是否是同花(大小)
          - 是否是对子(大小)
          - 是否是单点(大小)
      
  • 函数式编程:用函数来写代码。

    • 监控系统,监控公司的电脑【增强代码的重用性】【应用场景1】

      def 发送邮件():
          发送报警邮件-10print("欢迎使用xx监控系统")
      
      if CPU占用率 > 90%:
          发送邮件()
          
      if 硬盘使用率 > 95%:
          发送邮件()
          
      if 内容使用率 > 98%:
          发送邮件()
      
    • 棋牌游戏扎金花,【增强代码的可读性】

      def 发牌():
          ...
          ..
      
      def 是否是豹子():
          ..
          ..
          
      def 是否是同花顺():
          ..
          ..
          
      def 是否是同花():
          ..
          ..
          
      def 是否是对子():
          ..
          ..
          
      def 是否是单点():
          ..
          ..
          
      # 1.生成一副扑克牌6行代码
      
      # 2.洗牌3行代码
      
      # 3.给5个玩家发三张牌 15行代码
      发牌()
      
      # 4.玩家手中牌的大小比较(80行)
      是否是豹子()
      是否是同花顺()
      ...
      

函数应用场景:

  • 反复用到重复代码时,可以选择用函数编程。【增强代码的重用性】
  • 业务逻辑代码太长,可以选择用户函数将代码拆分。【增强代码的可读性】

2.Python代码发邮件

  • 注册邮箱:网易126、163邮箱。

  • 配置
    在这里插入图片描述

    在这里插入图片描述

    大家需要去获取授权码,通过代码发邮件,再发送邮件时不要告诉我的账号和密码。
    所以,Python代码后续需要使用的:
    	- 账号
    	- 授权码(不是网易邮箱的密码)
    	
    保存好自己的授权码。
    
    SMTP服务器: smtp.163.com
    

    在这里插入图片描述

  • 代码发邮件

    # 1.将Python内置的模块(功能导入)//该文件名不能叫smtplib或者email
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    
    # 2.构建邮件内容
    msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")  # 内容,"html", "utf-8"为固定形式
    msg["From"] = formataddr(["name", "1234567@126.com"])  # 自己名字/自己邮箱
    msg['to'] = "424662508@qq.com"  # 目标邮箱
    msg['Subject'] = "360一天"  # 主题
    
    # 3.发送邮件
    server = smtplib.SMTP_SSL("smtp.126.com")
    server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
    server.sendmail("yangliangran@126.com", "424662508@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
    server.quit()
    

案例

  1. 伪代码:监控系统

    def 发送邮件():
        # 1.将Python内置的模块(功能导入)
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        # 2.构建邮件内容
        msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")  # 内容
        msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])  # 自己名字/自己邮箱
        msg['to'] = "424662508@qq.com"  # 目标邮箱
        msg['Subject'] = "360一天"  # 主题
    
        # 3.发送邮件
        server = smtplib.SMTP_SSL("smtp.126.com")
        server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
        server.sendmail("yangliangran@126.com", "424662508@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
        server.quit()
    
    print("欢迎使用xx监控系统")
    
    if CPU占用率 > 90%:
        发送邮件()
        
    if 硬盘使用率 > 95%:
        发送邮件()
        
    if 内容使用率 > 98%:
        发送邮件()
    
  2. 需求

    # 目前我有3个邮箱,希望实现给三个邮箱发邮件。
    v1 = "424662788@qq.com"
    v2 = "424661509@qq.com"
    v3 = "42466901@qq.com"
    
    • 小白思路

      # 1.将Python内置的模块(功能导入)
      import smtplib
      from email.mime.text import MIMEText
      from email.utils import formataddr
      
      # ###### 领导1 ######
      
      # 2.构建邮件内容
      msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")  # 内容
      msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])  # 自己名字/自己邮箱
      msg['to'] = "424662508@qq.com"  # 目标邮箱
      msg['Subject'] = "360一天"  # 主题
      
      # 3.发送邮件
      server = smtplib.SMTP_SSL("smtp.126.com")
      server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
      server.sendmail("yangliangran@126.com", "424662508@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
      server.quit()
      
      # ###### 领导2 ######
      # 2.构建邮件内容
      msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")  # 内容
      msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])  # 自己名字/自己邮箱
      msg['to'] = "424662509@qq.com"  # 目标邮箱
      msg['Subject'] = "360一天"  # 主题
      
      # 3.发送邮件
      server = smtplib.SMTP_SSL("smtp.126.com")
      server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
      server.sendmail("yangliangran@126.com", "424662509@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
      server.quit()
      
      # ###### 领导3 ######
      # 2.构建邮件内容
      msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")  # 内容
      msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])  # 自己名字/自己邮箱
      msg['to'] = "424662501@qq.com"  # 目标邮箱
      msg['Subject'] = "360一天"  # 主题
      
      # 3.发送邮件
      server = smtplib.SMTP_SSL("smtp.126.com")
      server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
      server.sendmail("yangliangran@126.com", "424662501@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
      server.quit()
      
    • 函数实现

      # 1.将Python内置的模块(功能导入)
      import smtplib
      from email.mime.text import MIMEText
      from email.utils import formataddr
      
      def send_email1():
          # 2.构建邮件内容
          msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")
          msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])
          msg['to'] = "424662508@qq.com"  # 目标邮箱
          msg['Subject'] = "360一天"  # 主题
      
          # 3.发送邮件
          server = smtplib.SMTP_SSL("smtp.126.com")
          server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
          server.sendmail("yangliangran@126.com", "424662508@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
          server.quit()
          
      def send_email2():
          # 2.构建邮件内容
          msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")
          msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])
          msg['to'] = "424662509@qq.com"  # 目标邮箱
          msg['Subject'] = "360一天"  # 主题
      
          # 3.发送邮件
          server = smtplib.SMTP_SSL("smtp.126.com")
          server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
          server.sendmail("yangliangran@126.com", "424662509@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
          server.quit()
          
      def send_email3():
          # 2.构建邮件内容
          msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")
          msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])
          msg['to'] = "424662501@qq.com"  # 目标邮箱
          msg['Subject'] = "360一天"  # 主题
      
          # 3.发送邮件
          server = smtplib.SMTP_SSL("smtp.126.com")
          server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
          server.sendmail("yangliangran@126.com", "424662501@qq.com", msg.as_string())  # 自己邮箱/目标邮箱/内容
          server.quit()
          
          
      send_email1()
      send_email2()
      send_email3()
      
    • 函数的参数

      def 函数名():
          pass
      
      函数名()
      
      def 函数名(data):
          print(data)
      
      函数名("123")
      函数名(666)
      
      # 1.将Python内置的模块(功能导入)
      import smtplib
      from email.mime.text import MIMEText
      from email.utils import formataddr
      
      def send_email(to_email):
          # 2.构建邮件内容
          msg = MIMEText("领导早上好,领导今天辛苦了。", "html", "utf-8")
          msg["From"] = formataddr(["武沛齐", "yangliangran@126.com"])
          msg['to'] = to_email  # 目标邮箱
          msg['Subject'] = "360一天"  # 主题
      
          # 3.发送邮件
          server = smtplib.SMTP_SSL("smtp.126.com")
          server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")
          server.sendmail("yangliangran@126.com", to_email, msg.as_string())
          server.quit()
          
      send_email("424662508@qq.com")
      send_email("424662509@qq.com")
      send_email("424662501@qq.com")
      

3.函数的参数

3.1 基本使用

def 函数名(形式参数1,形式参数2,形式参数3): # 简称形参
    函数内部代码,将形式参数当做是变量来使用。

    
# 执行函数时,传入的值:实际参数(实参)
函数名(1,2,3)
def my_func(a1,a2,a3):
    result = a1 + a2 - a3
    print(result)
    
# 执行函数
my_func(1,4,1)

# 执行函数
my_func(11,14,99)

在执行函数时,传入参数时候一般有两种模式:

  • 位置传参

    def my_func(a1,a2,a3):
        result = a1 + a2 - a3
        print(result)
        
    # 执行函数
    my_func(1,4,1)//my_func(1,2,3)
    
    # 执行函数
    my_func(11,14,99)
    
  • 关键字传参

    def my_func(a1,a2,a3)://my_func(a1 = 1,a2 = 2,a3 = 3)
        result = a1 + a2 - a3
        print(result)
    
        
    my_func(a1=11,a2=99,a3=10)
    
    my_func(a2=99,a3=10,a1=10)
    
  • 混合使用

    def my_func(a1,a2,a3):
        result = a1 + a2 - a3
        print(result)
    
    # 位置传参在前面,关键字传参是在后面!!!只能位置传参在前,关键字传参在后
    my_func(123,99,a3=10)
    
    my_func(123,a2=99,a3=10)
    

注意:

  • 函数要求传入几个参数,你就要传入几个参数。
  • 参数可以是任意类型:None、bool、int、str、list、dict…

练习题

  1. 定义函数,接收1个字符串类型的参数,函数内部计算字符串中 字符 “a” 出现的次数并输出。

    def func(data_string):
        count = 0
        for item in data_string:
            if item == "a":
                count += 1
        print(count)
    
    func("asduf;akjsdfakejaknduqkjnakjdfa;ds")
    
  2. 定义函数,接收2个参数:字符串-文本字符串-关键字,计算某一个字符串出现的次数。

    def func(data_string, key):
        count = 0
        for item in data_string:
            if item == key:
                count += 1
        print(count)
        
    func("afdsfasdfasdfasldfkqj;kjafsdf", "a")
    func("afdsfasdfasdfasldfkqj;kjafsdf", "b")
    func("ffffffffsdfsd;kjafsdf", "f")
    
  3. 定义函数,接收1个参数:列表,列表中以 a 开头的所有元素并将此元素添加到列表中再输出.

    def func(data):
        res = []
        for item in data:
            if item.startswith("a"):
                res.append(item)
    	print(res)
        
    func(["xxx","武沛齐","xxx","alex"])
    
    v1 = ["xxx","武沛齐","xxx","alex"]
    func(v1)
    

3.2 默认参数

def func(a1,a2,a3):
    pass

func(1,2,3)

在定义函数时,也可以为某个参数设置默认值。

def func(a1,a2=1,a3=123):
    pass

# 位置传参
func(9)//没有传参的时候用默认值
func(9,10)
func(9,10,100)

# 关键字传参
func(a1=9)
func(a1=100,a2=9)
func(a1=100,a2=9,a3=123)

# 注意注意:函数定时设置的默认参数,只能放在最后。

练习题

def func(data_string, key="a"):
    count = 0
    for item in data_string:
        if item == key:
            count += 1
    print(count)
    

func("afdsfasdfasdfasldfkqj;kjafsdf")
func("afdsfasdfasdfasldfkqj;kjafsdf", "a")
func("afdsfasdfasdfasldfkqj;kjafsdf", "b")
func("ffffffffsdfsd;kjafsdf", "f")

3.3 动态参数

def func(a1,a2,a3=123):
    pass

func(1,2)

# 参数传入的都是有限的个数。
    def func(*a1)://*a1为可以传任意个参数
        # 用户传来的参数统一会被打包成元组
        # a1 = (1,)
        # a1 = (11,22,33)
        # a1 = (11,22,33,"xxxx",True)
        # a1 = (11,22,33,"xxxx",True, [11,22,33],999)
        # a1 = ( [11,22,33,44,55] ,  )
        # a1 = ( (11,22,33),   )
        print(a1)
        
    # 可以通过位置参数的形式传入n个参数。
    func(1)
    func(11,22,33)
    func(11,22,33,"xxxx",True)
    func(11,22,33,"xxxx",True, [11,22,33],999)
    
    func( [11,22,33,44,55] )
    func( (11,22,33) )
    func()
    
  • **

    def func(**dt):**dt为可以传任意个参数
        # 自动将数据打包整字典
        # dt = {"a1":1,"b1":88,"cc":99}
        print(dt)
        
    # 必须用关键字的形式传参
    func(a1=1,b1=88,cc=99)//里面代指参数也传进去
    func(a1=1,b1=88,cc=99)
    func()
    
  • *

    def func(*x1,**dt):
        # x1 = (11,22,3)   dt = {"xx":123,"uu":999, "b12":"root"}
        # x1 = ()    dt = {}
        pass
    
    func(11,22,3, xx=123,uu=999,b12="root")
    func()
    
    # 注意实现
    #   1.定义函数顺序 //只能一个*在前,    *x1,**dt
    #	2.执行函数传参的时,位置传参在前,关键字传参在后。
    #	3.当不传参数时,# x1 = ()    dt = {}空元组,空字典
    
  • 混合之前的使用

    def func(a1,a2,a3,*x1,**dt):
        pass
    
    func(11,22,33,44,55,66,77,a1=123)//a1,a2,a3为11,22,3344,55,66,77,*x1,
    

重点:

  • * 支持传入多个参数,自动会将参数打包成 元组 、字典。

  • 【潜规则】在定义动态参数时,*args、**kwargs

    def func(*args,**kwargs)://*args  **kwargs
        pass
    

4.函数的返回值

  • print,输出,可以在任何的地方使用。
  • 函数的返回值

在以后的开发过程中,定义一个函数,帮助你实现某个功能,希望函数给你产出一个结果。

def func(a1,a2):
    res = a1 + a2
    return res

# 1.执行func函数
# 2.将函数执行的返回值 赋值给data
data = func(100,200)

关于返回值:

  • 返回值可以是任意类型

    def f1():
        return 123
    
    v1 = f1()
    
    def f1():
        return [11,22,33,44]
    
    v1 = f1()
    
    def f1():
        return (11,22,33,44)
    
    v1 = f1()
    
    def f1():
        return 11,22,33  # 返回的是一个元组 (11,22,33)
    
    v1 = f1()
    
  • 函数没有返回值,默认返回None(**)

    def func(a1,a2):
        res = a1 + a2
        
    # data = None
    data = func(100,200)
    
  • 在函数的执行过程中,一旦遇到return,立即结束当前函数的执行并返回值。

    def func():
        v1 = 123
        v2 = 456
        return 999
    	v3 = 180
        
    res = func()
    
    def func():
        for i in range(100):
            return i
        
    res = func() # 0
    
    def func():
        for i in range(100):
            break
        
    res = func() # res = None
    
    def func():
        for i in range(100):
            continue
        
    res = func() # res = None
    
    def func():
        for i in range(100):
            print(i)
        print("END")
    res = func() # 函数返回值 res=None
    
  • 在函数中可以只写return,后面没有值也是返回None

    def func():
        print(1)
        print(2)
        return 
    	print(3)
        
    res = func()
    

练习题

  1. 定义一个函数,可以接收任意个参数(位置传参 + 整数),在函数的内部将所有的参数相加并获得结果,返回给函数的调用者。

    def get_sum(*args):
        # args = (11,22,33,44)
        # args = (11,2,3)
        res = 0
        for item in args:
            res += item # res = res + item
    	return res
    
    v1 = get_sum(11,22,33,44)
    
    v2 = get_sum(11,2,3)
    
  2. 看代码写结果(输出)

    def func():
        print("开始")
    	for i in range(2):
            print(i)
    	print("结束")
        
    res = func()
    print(res)
    
    开始
    0
    1
    结束
    None
    
  3. 看代码分析结果(输出)

    print("123",end="")
    print("456")
    
    def func():
        print("开始")
    	for i in range(2):
            print(i)
            break
    	if 2 == 2:
            return 999
        else:
            return 123
        print("结束")
        
    res = func()
    print(res)
    
    开始
    0
    999
    
  4. 写函数,接收两个参数。

    • 参数1:字符串,文件路径。

    • 参数2:字符串

    • 函数内部:

      • 判断文件是否存在,如果文件不存在,则返回None

        import os
        
        file_path = r"/Users/wupeiqi/PycharmProjects/gx_day05"
        res = os.path.exists(file_path)
        print(res) # True/False
        
      • 读取文件的每一行数据,判断 每一行是否包含 参数2:字符串

        • 在,将这一行数据追加到列表中。
        • 不在,继续读下一行
      • 返回列表,包含字符串的每一行数据。

    • 自己调用自己写的这个函数,来进行验证。

    import os
    
    def check_file_key(file_path, key):
        # 判断路径是否存在 False/True
        res = os.path.exists(file_path)
        if not res:
            return None
    	
        data_list = []
        
        # 文件存在
        file_object = open(file_path,mode='r',encoding="utf-8")
        
        for line in file_object:
            line = line.strip()
            # line = "字符串.."
        	if key in line:
                data_list.append(line)
        file_close()
        
        return data_list
    
    result = check_file_key("/user/xxxx/xxxx/xxx", "哈哈")
    

5. 函数的调用

def func():
    print(123)
    print(123)
    
func()
func() # 报错

def func():
    print(123)
    print(123)

注意:内存中如果已创建了函数,才可以调用。

def f1():
    print(123)
    
def f2():
    print(456)
    
f1()
f2()
f1()
def f1():
    print(123)
    return 1
    
def f2(arg):
    data = arg + 100
    return data
    
def f3(xx):
    print(xx)
    
v1 = f1()
v2 = f2(v1)
v3 = f3(v2)

# v1= 1
# v2= 101
# v3= None
def f1():
    print(1)
    print(2)
    
def f2():
    print(666)
    f1()
    print(999)
    
f2()
666
1
2
999
def f1():
    print(1)
    print(2)
    
def f2():
    print(666)
    data = f1()
    print(data)
    print(999)
    
f2()
666
1
2
None
999

在数据类型的学习中我们学过可变和不可变类型:

  • 可变类型:列表、字典、集合【独有、公共能时,一般都可以对内部元素进行修改】
  • 不可变类型:字符串、整型、元组、布尔类型

6. 函数参数传递的是内存地址

v1 = "武沛齐"
v2 = v1

在这里插入图片描述

def func(a1):
    print(a1)

v1 = "武沛齐"
func(v1)

# 注意:函数在传递参数时,默认不会重新创建一份数据,再赋值给函数中的参数,而是同时指向同一块内存。
# 参数传递是:引用、内存地址。
def func(a1):
    a1.upper()

v1 = "wupeiqi"
func(v1)

print(v1) # wupeiqi

注意:a1和v1是同一块内存地址,但由于字符串是不可变类型。a1.upper() 生成新的值。

def func(a1):
    a1.append(666)

v1 = [11,22,33]
func(v1)

print(v1) # [11,22,33,666]

注意:a1和v1是同一块内存地址,但由于列表是可变类型 & append是在原列表中追加数据。

注意事项:

  • 函数传递参数时,默认传递是内存地址/引用(不会重新拷贝一份数据再传递)
  • 一定要注意参数传递是可变/不可变类型; 函数内部执行操作时,是重新生成数据;修改原数据。

7.数据是否会混乱?

def func(a1):
    data = a1 + 100
    print(data)
    
func(100)    func(200)

当我们每次执行一个函数时,都会为此执行的过程创建一块内存(调用栈)。

8.作用域

8.1 作用域基础

  • 作用域,理解成就是一块内存区域,只要在这个区域就可以共享这个区域的数据。
  • 在Python中,执行函数函数,就会为函数创建一个作用域。
  • Python代码只要一运行,就会有一个全局的作用域。
name = "武沛齐"
# print(age) # 报错、999
age = 999
if True:
    email = "xxx@live.com"
else:
    gender = "男"
    
for i in range(10):
    pass
print(name)
print(age)  # 999
print(email)
print(i)
age = 100
print(age)  # 100

# print(gender) # 报错
name = "武沛齐"

def func():
    v1 = 100
    v2 = 200
    v3 = v1 + v2
    print(v3)
func()

def f1():
    age = 19
    print(age)
    
def f2():
    print(age)
    
f1()
# f2() # 报错

def f3():
    txt = "我是"
    data = text + name
    print(data)

f3()

def f4():
    txt = "我是"
    name = "李国良"
    data = text + name
    print(data)

f4()

print(name) # "李国良" / "武沛齐"

# 寻找变量的值时,优先回去自己的作用域中找,自己没有的话,去父级作用域找。
# print(v1) # 报错 / 100 --> 报错。

注意:

  • 在Python中函数是一个作用域。
  • 在作用域中寻找数据时,优先在自己作用域找,自己没有就去上级作用域找。

8.2 关于变量

  • 全局变量,在非函数中定义的(py文件顶层)
  • 局部变量,在函数中定义的变量。

潜规则:定义全局变量时,要用大写,多个单词用下划线连接。

# 全局变量
NAME = 123
if 1 == 1:
    # 全局变量
    AGE = 18

def func():
	# 局部变量
    data = 999

案例:用户注册系统和展示系统

USER_LIST = []

def register():
    while True:
        name = input(">>>")
        if name.upper() == "Q":
            return 
        USER_LIST.append(name)

def show_users():
    name = "xxx"
    for item in USER_LIST:
        print(item)

def run():
    register()
    show_users()
    
run()
NAME = "武沛齐"

def func():
    NAME = "张电摩"
    print(NAME)

print(NAME)
func()
print(NAME)
武沛齐
张电摩
武沛齐

8.3 global关键字

global是用在函数中,用于表示此变量不是新创建的数据,而是全局变量中的那个数据(地址指向相同)。

案例1:

NAME = "武沛齐"

def func():
    global NAME      # 指的就是全局变量中的NAME
    NAME = "张电摩"   # 将全局变量的那个值重新赋值成张电摩
    print(NAME)

print(NAME)
func()
print(NAME)
武沛齐
张电摩
张电摩

关键:

  • 内部global之后,变量就是全局变量。

  • 赋值操作

    NAME = "武沛齐"
    NAME = "张电摩"
    

    动态

案例2:

NAME = "root"
NAME.upper()

print(NAME) # root
NAME = "root"

def func():
    global NAME      # 指的就是全局变量中的NAME
    NAME.upper()
    print(NAME)

print(NAME)
func()
print(NAME)
root
root
root

案例3:

NAME = [11,22]

def func():
    global NAME      # 指的就是全局变量中的NAME
    NAME = [33,44]
    print(NAME)

print(NAME)
func()
print(NAME)
[11,22]
[33,44]
[33,44]

案例4:

NAME = [11,22]

def func():
    global NAME
    NAME.append(999)
    print(NAME)

print(NAME)
func()
print(NAME)
[11,22]
[11,22,999]
[11,22,999]
  • 局部变量中没有变量,去哪里找?
  • append是生成新的值?原来的列表中修改。

案例5:

NAME = [11,22]

def func():
    NAME = [33,44]  # 将全局的值修改成 [33,44]
    NAME.append(999)
    print(NAME)

print(NAME)
func()
print(NAME)
[11,22]
[33,44,999]
[33,44,999]
核心要领
  • 找变量,优先在自己作用域找,自己没有就去上一级找。

  • 【无global关键字】全局变量和局部变量重名时,自己内部创建的变量,与全部无关

    name = "武沛齐"
    
    def info():
        name = "root"
        print(name)
        
    print(name)
    info()
    print(name)
    
  • 【有global关键字】全部变量和局部变量重名时,所有的都是全局变量。

    name = "武沛齐"
    
    def info():
        global name
        name = "root"
        print(name)
        
    print(name)
    info()
    print(name)
    

9.函数名就是变量名

name = "武沛齐"
age = 18
def func():
    print(123)
    print(456)
    
func = 123
print(func) # 123
v1 = "武沛齐"
v2 = v1

print(v2) # "武沛齐"
def func():
    print(123)
    return 111

data = func()
def func():
    print(123)
    print(123)
    print(123)
    
v1 = func
v2 = func()
v3 = v1()
# v1 = 函数func
# v2 = None
# v3 = None

本质上:func就是一个变量,代指这个函数而已, func() -> 执行函数。

在Python的列表中可以存放各种数据类型:

data = [11,22,True,"xxx",(11,223),{},]
def func():
    return 123

v1 = 999

data_list = [1,2,"武沛齐",v1, func, func, func, func(), func() ]

data_list[4] # 函数
m1 = data_list[4]()

data_list[5] # 函数
m2 = data_list[5]()

data_list[6] # 函数
m3 = data_list[6]()

data_list[7] # 123
data_list[8] # 123

补充代码实现:开发xx系统,监控功能:发送钉钉报警、微信报警、短信报警、邮件报警。

def send_sms():
    print("发送短信报警")
    
def send_email():
    print("发送邮件报警")
    
def send_dingding():
    print("发送钉钉报警")
    
def send_wechat():
    print("发送微信报警")
    
if 达到某种指标:
    send_sms()
    send_email()
    send_dingding()
    send_wechat()
def send_sms():
    print("发送短信报警")
    
def send_email():
    print("发送邮件报警")
    
def send_dingding():
    print("发送钉钉报警")
    
def send_wechat():
    print("发送微信报警")

    
func_list = [ send_sms, send_email, send_dingding, send_wechat ]
for item in func_list:
    item()

案例:用户管理系统

请基于函数实现用户登录、注册、查看所有用户信息。

  • 普通版
def register():
    pass

def login():
    pass

def show_users():
    pass

print("欢迎xx系统")
print("1.注册;2.登录;3.查看所有用户")

choice = input("请选择序号:")
choice = int(choice)

if choice == 1:
    register()
elif choice == 2:
    login()
elif choice == 3:
    show_users()
else:
    print("选择错误")
  • vip版本
def register():
    pass

def login():
    pass

def show_users():
    pass

print("欢迎xx系统")
print("1.注册;2.登录;3.查看所有用户")

choice = input("请选择序号:")
choice = int(choice)

func_list = [register, login, show_users]
# func_list[0]()
# func_list[1]()
# func_list[2]()
func_list[ choice-1 ]()
  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值