python02-数据类型和函数

目录

1.数据类型

1.1 字符串

1.1.1 定义

1.1.2 独有功能

1.1.3 公共功能

1.2 列表

1.2.1 定义

1.2.2 独有功能

1.2.3 公共功能

1.3 元组

1.3.1 定义

1.3.2 独有功能

1.3.3 公共功能

1.4 字典

1.4.1 定义

1.4.2 独有功能

1.4.3 公共功能

1.5 补充

1.5.1 嵌套

1.5.2 转换

1.5.3 类型分类

2.函数

2.1 Python发送邮件

2.2 参数

2.2.1 默认参数

2.2.2 动态参数

2.3 返回值

2.4 作用域

2.5 生成器

2.6 装饰器

2.7 匿名函数(lambda表达式)

今日概要:

  • 数据类型:字符串、列表、字典、元组

  • 函数

1.数据类型

每种数据类型都有自己的特点及应用场景,以后的开发中需要根据实际的开发情况选择合适的数据类型。

1.1 字符串

1.1.1 定义
name = "武沛齐"
data = "beijing"
1.1.2 独有功能
  1. 判断是否以xx开头

    v1 = "中国上海移动"
    ​
    # True/False
    result = v1.startswith("中国")
    addr = input("请输入地址:")
    ​
    if add.startswith("上海"):
        print("本地户口")
    else:
        print("外地户口")
  2. 判断是否以xx结尾

    v1 = "中国上海移动"
    ​
    # True/False
    result = v1.endswith("移动")
    addr = input("请输入地址:")
    ​
    if add.endswith("村"):
        print("农业户口")
    else:
        print("非农户口")
  3. 判断是否是数字

    data = "123"
    result = int(data)
    print("欢迎使用xx系统,请选择:1.xxxx;2.xxxx")
    ​
    choice = input("请输入序号:")
    ​
    # True/False
    if choice.isdecimal():
        msg = "您选择的序号是:{}".format(choice)
        print(msg)
    else:
        print("输入错误")
    v1 = input("请输入数字:")
    v2 = input("请输入数字:")
    ​
    if v1.isdecimal() and v2.isdecimal():
        data = int(v1) + int(v2)
        print(data)
    else:
        print("格式错误")
  4. 大小写

    msg = "Root"
    
    data = msg.upper() # ROOT
    
    print(data) # ROOT
    print(msg)  # Root
    msg = "Root"
    
    data = msg.lower() # root
    
    print(data) # root
    print(msg)  # Root

    注意:字符串类型是不可变(内部元素修改了)。

    name = 'root'
    name = "ROOT"
    print(".....")
    choice = input("是否继续(y/n)")   # y/Y
    data = choice.upper()
    if data == "Y":
        print("继续")
    else:
        print("退出")
  5. 去除空白

    data = "中国移动 "
    
    result = data.rstrip()  # "中国移动"
    
    print(result) # "中国移动"
    print(data)   # "中国移动 "
    data = " 中国移动"
    
    result = data.lstrip()  # "中国移动"
    
    print(result) # "中国移动"
    print(data)   # " 中国移动"
    data = " 中国移动 "
    
    result = data.strip()  # "中国移动"
    
    print(result) # "中国移动"
    print(data)   # " 中国移动 "
    text = input("请输入内容:")
    data = text.strip()
    print(data)
    # 用户登录案例
    user = input("用户名:")  # "xxxx "
    pwd = input("密码:")  # "xxxx "
    
    user = user.strip() # "xxxx"
    pwd = pwd.strip()
    
    if user == "root" and pwd == "xxx":
        pass
    # 用户登录案例
    user = input("用户名:").strip()  # "xxxx "   "xxxx"
    pwd = input("密码:").strip()  # "xxxx "
    
    if user == "root" and pwd == "xxx":
        pass
  6. 替换

    data = "中国 上海 移动"
    
    result = data.replace("海", "河")
    print(result)
    data = "中国 上海   移动"
    
    result = data.replace("", "")
    print(result)
    data = "中国上海移动"
    result = data.replace("上海","**")
    print(result) # "中国**移动"
    print(data) # "中国上海移动"
    # 1.提示用户输入文本
    # 2.对于输入的文本进行替换   上海  **         北京  **
    
    data = input("请输入:")  # 中国移动核心的有上海和北京两个公司
    v1 = data.replace("上海","**") # 中国移动核心的有**和北京两个公司
    v2 = v1.replace("北京","**")   # 中国移动核心的有**和**两个公司
    data = input("请输入:")  # 中国移动核心的有上海和北京两个公司
    data = data.replace("上海","**") # 中国移动核心的有**和北京两个公司
    data = data.replace("北京","**") # 中国移动核心的有**和**两个公司
    print(data)
    data = input("请输入:")  # 中国移动核心的有上海和北京两个公司
    
    key_list = ["上海","北京","深圳"]
    for key in key_list:
        data = data.replace(key,"**")
    
    print(data)
    data = "中国移动核心的有上海和北京两个公司"
    data = data.replace("上海","**").replace("北京","**")
    print(data)
  7. 切割 csv

    line = "199999999,12312,武沛齐"
    
    data = line.split(",")  # ["199999999","12312","武沛齐"]
    print(data)
    text = """199999999|12312|武沛齐1
    199999999|12312|武沛齐2
    199999999|12312|武沛齐3
    199999999|12312|武沛齐4
    199999999|12312|武沛齐5
    199999999|12312|武沛齐6
    199999999|12312|武沛齐7"""
    
    data_list = text.split("\n")
    # ['199999999|12312|武沛齐1', '199999999|12312|武沛齐2', '199999999|12312|武沛齐3', '199999999|12312|武沛齐4', '199999999|12312|武沛齐5', '199999999|12312|武沛齐6', '199999999|12312|武沛齐7']
    
    for line in data_list:
        row_list = line.split("|")  # ['199999999', '12312', '武沛齐1']
        mobile = row_list[0]
        code = row_list[1]
        name = row_list[2]
        message = "姓名:{},手机号:{},验证码是{}".format(name, mobile, code)
        print(message)
  8. 拼接

    data_list = ['199999999', '12312', '武沛齐1']
    
    line = "{},{},{}".format(  data_list[0] , data_list[1] ,data_list[2] )
    print(line)
    data_list = ['199999999', '12312', '武沛齐1']
    
    result = ",".join(data_list)
    print(result) # 199999999,12312,武沛齐1
  9. 字符串和字节

    # unicode编码存储,4字节存储
    #     中    00000000 10000100 00001000 00000010
    #     国    00000000 10110100 00001001 00001001
    #     移    00000000 10110101 00001001 00001001
    #     动    00000000 10111100 00001001 00001001
    #     A     00000000 00000000 00000000 00001001
    data = "中国移动A"     # 字符串
    
    # 将字符串转换成utf-8编码(压缩,能用更少的字节)
    #     中    10000100 00001000 00000010
    #     国    10110100 00001001 00001001
    #     移    10110101 00001001 00001001
    #     动    10111100 00001001 00001001
    #     A     00001001
    result = data.encode("utf-8")  # 字节
    
    
    new_data = result.decode("utf-8") # "中国移动A"

案例:用户输入手机号/密码/验证码,对于用户输入的值去除空白再进行判断 root qwe123。

import random

code = random.randrange(1000,9999)
message = "验证码是:{}".format(code)
print(message)

user = input("用户名:").strip()
pwd = input("密码:").strip()
user_code = input("验证码:").strip()

if user == "root" and pwd == "qwe123" and user_code == str(code):
    print("成功")
else:
    print("失败")

1.1.3 公共功能
  • 计算长度

    name = "root"
    size = len(name)
    print(size) # 4
  • 索引

    #       0123
    name = "root"
    
    # 只能读
    v1 = name[0]
    print(v1)
    
    print(name[1])
    
    name[2]
    name[ len(name)-1 ]
    name[ len(name)-2 ]
    name[-1]
  • 切片

    #       0123
    name = "root"
    v1 = name[0:2] # "ro"
    print(v1)
  • for循环

    name = "root"
    for  item in name:
    	print(item) # r   o    o   t

1.2 列表

1.2.1 定义
data = [ 1, 2, 3, "root","北京",True]
nums = [11,22,33,44]

1.2.2 独有功能
  1. 追加,在原列表的尾部追加一个元素

    data = [1, 2, 3, "root","北京",True]
    data.append("上海")
    print(data) # [1, 2, 3, "root","北京",True,"上海"]
    # 案例
    user_list = []
    
    while True:
        user = input("请输入用户名(Q退出):").strip()
        if user.upper() == "Q":
            break
        user_list.append(user)
    
    print("停止注册")
    # print(user_list)  # ['root', 'eric', 'seven', 'kelly']
    msg = "已经注册账户:{}。".format("、".join(user_list))
    print(msg)
    
  2. 插入,将元素插入到原列表的指定位置

    #       0  1  2    3      4    5
    data = [1, 2, 3, "root","北京",True]
    data.insert(0,"上海")
    data = [1, 2, 3, "root","北京",True]
    # data.insert(0,"上海")
    data.insert(2,"上海")
    print(data)
    name_list = []
    
    while True:
        name = input("请输入姓名:")
        if name.upper() == "Q":
            break
        if name.startswith("刁"):
            name_list.insert(0, name)
        else:
            name_list.append(name)
    
    print(name_list)
  3. remove,删除

    data_list = ['刁民', 'eric', '武沛齐', 'eric', '中明']
    data_list.remove("eric")
    print(data_list)
    # 想要删除的前提是,他一定在列表中存在。
    data_list = ['刁民', 'eric', '武沛齐', 'eric', '中明']
    
    # True/False
    if "eric" in data_list:
        data_list.remove("eric")
    
    print(data_list)
    data_list = ['刁民', 'eric', '武沛齐', 'eric', '中明']
    
    # True/False
    while "eric" in data_list:
        data_list.remove("eric")
    
    print(data_list)
    # 抽奖
    import random
    
    data_list = ['刁民', 'eric', '武沛齐', 'eric', '中明']
    
    # 1.随机在列表中抽出1个人 -> 500w
    name = random.choice(data_list)
    msg = "恭喜 {} 获得500w奖金".format(name)
    print(msg)
    
    # 2.删除已抽到的人
    data_list.remove(name)
    
    
    # 3.在抽出1个人 --> 1000w
    name = random.choice(data_list)
    msg = "恭喜 {} 获得1000w奖金".format(name)
    print(msg)
  4. 清空列表

    data_list = ['刁民', 'eric', '武沛齐', 'eric', '中明']
    
    data_list.clear()
    print(data_list)
  5. 排序

    data_list = [100, 11, 88, 22, 33, 44, 55]
    data_list.sort() # 从小到大
    print(data_list)
    data_list = [100, 11, 88, 22, 33, 44, 55]
    data_list.sort(reverse=True)  # 从大到小
    print(data_list)
    data_list = ["武沛齐", "赵敏", "李娜"]
    data_list.sort()
    print(data_list)
    
    # 依据是什么呢?unicode编码值的大小来进行比较。
  6. 翻转

    data_list = ["武沛齐", "赵敏", "李娜"]
    data_list.reverse()
    print(data_list)

1.2.3 公共功能
  • 长度

    data_list = ["武沛齐", "赵敏", "李娜"]
    
    size = len(data_list)
    print(size) # 3
  • 索引

    data_list = ["武沛齐", "赵敏", "李娜"]
    
    # 读取
    print(data_list[0])
    data_list[1]
    data_list[2]
    data_list[-1]
    data_list[-2]
    
    # 修改
    data_list[1] = "张弛"
    print(data_list) # ["武沛齐", "张弛", "李娜"]
    
    # 删除
    del data_list[1]
    print(data_list) # ["武沛齐", "李娜"]
  • 切片

    data_list = ["武沛齐", "赵敏", "李娜"]
    
    print(data_list[0:2]) # ["武沛齐", "赵敏"]
  • for循环

    data_list = ["武沛齐", "赵敏", "李娜"]
    for item in data_list:
        print(item)
    for i in range(5): # [0,1,2,3,4]
        print(i)
    data_list = ["武沛齐", "赵敏", "李娜"]
    
    for i in range(len(data_list)): # [0,1,2,]
        item = data_list[i]
        print(item)
    goods = ["汽车", "飞机", "火箭"]
    
    print("可供选择的商品有:")
    for item in goods:
        print(item)
    
    choice = input("请选择:")
    print(choice)
    goods = ["汽车", "飞机", "火箭"]
    
    print("可供选择的商品有:")
    for idx in range(len(goods)):
        print(idx, goods[idx])
    
    choice_idx_str = input("请选择索引:")
    if choice_idx_str.isdecimal():
        choice_idx = int(choice_idx_str)
        if choice_idx >= 0 and choice_idx < len(goods):
            text = goods[choice_idx]
            print(text)
        else:
            print("序号输入错误")
    else:
        print("请输入数字序号")

1.3 元组

1.3.1 定义
data = [11,22,33,44]  # 列表
data = (11,22,33,44)  # 元组
v1 = (11,22,33)
v2 = (11,22,33,)
v1 = (11)    # 11
v2 = (11,)   # (11,)
1  (1)  (1,)

1.3.2 独有功能

1.3.3 公共功能
  • 长度

    v1 = (11,22,33)
    size = len(v1)
    print(size)
  • 索引

    v1 = (11,22,33)
    v1[0]
    v1[1]
    v1[-1]
  • 切片

    v1 = (11,22,33)
    v1[0:2]
  • for循环

    v1 = (11,22,33)
    for item in v1:
        print(item)

1.4 字典

1.4.1 定义
info = { "k1":123, "name":"武沛齐", "age":99 }
  • 键:必须得是可哈希的类型,目前可哈希:int、bool、str、元组(tuple)

    info = {
    	1:123,
    	"xxx":999
    	False:888,
    	(11,2):"你好呀",
    }
  • 值:可以是任意类型。

1.4.2 独有功能
  1. 获取值

    info = {
        "age":123,
        "status":True,
        "name":"武沛齐"
    }
    
    # 根据键获取对应的值
    v1 = info.get("name")
    print(v1) # "武沛齐"
    
    # 根据键获取对应的值
    v1 = info.get("xxxxx")
    print(v1) # None
    
    # 根据键获取对应的值
    v1 = info.get("xxxxx",666)
    print(v1) # 666
  2. 键/值/键值对

    info = {
        "age":123,
        "status":True,
        "name":"武沛齐"
    }
    
    data = info.keys()    # ["age","status","name"]
    data = info.values()  # [123,True,"武沛齐"]
    data = info.items()   # [   ["age",123],   ["status",True],  ["name","武沛齐"]  ]
    for item in info.keys():
    	print(item)
    	
    for item in info.values():
    	print(item)
    	
    for item in info.items():
    	# print(item) # ["age",123]
    	print(item[0],item[1])
    	
    for k,v in info.items():
    	print(k,v)
    data = [11,22,33]
    a1,a2,a3 = [11,22,33]

1.4.3 公共功能
  • 长度

    info = {
        "age":123,
        "status":True,
        "name":"武沛齐"
    }
    size = len(info)
    print(size) # 3
  • 索引

    data = [11,22,33,44]
    data[3]
    
    # 读取
    info = {
        "age":123,
        "status":True,
        "name":"武沛齐"
    }
    v1 = info.get("age") # 如果获取数据,推荐使用它。
    v2 = info["agexxx"]
    
    # 增
    info['xxx'] = 888
    
    # 删除
    del info["age"]
    
    # 修改
    info["age"] = 999
  • for循环 keys/values/items方法来使用。

1.5 补充

1.5.1 嵌套

数据类型由于现在出现了容器类型很容易出现嵌套关系。

# user_list = [ ("wupeiqi","123"),("alex","888"),("eric","888") ]

# 1.用注册,让用户输入 用户名 / 密码 构造成元组,再将元组添加到列表中。
user_list = []
while True:
    user = input("用户名:")
    if user.upper() == 'Q':
        break
    pwd = input("密码:")
    group = (user, pwd)
    user_list.append(group)
print(user_list)


# 2.登录
user_list = [("wupeiqi", "123"), ("alex", "888"), ("eric", "888")]

user = input("用户名:")
pwd = input("密码:")

is_success = False
for item in user_list:
    if item[0] == user and item[1] == pwd:
        is_success = True
        break

if is_success:
    print("登录成功")
else:
    print("登录失败")

# 商品信息选择
goods = [
    {"title": "电脑", "price": 1999},
    {"title": "鼠标", "price": 99},
    {"title": "硬盘", "price": 199},
    {"title": "显示器", "price": 888},
]

# 1.输出 序号  标题  价格
for idx in range(len(goods)):
    item = goods[idx]
    print(idx + 1, item['title'], item['price'])

# 2.请用户选择(类型判断、范围的判断)
choice = input("请选择序号:")
choice = int(choice)
data_dict = goods[choice - 1]

# 3.输出选择的信息
print(data_dict)

1.5.2 转换
  • int

  • bool

  • str

  • list

  • tuple

  • dict

大原则,想转换成什么类型,就要用什么类型去包裹。

str  - int
list - tuple
	v1 = [11,22,33]
	data = tuple(v1)
	print(data) # (11,22,33)

特别要注意,其他类型转换成布尔值时:只有 0、空字符串、空列表、空字典、空元祖、None -> False,其他均为True

data = [11,22,]
if data:
	print(123)
else:
	print(456)

1.5.3 类型分类
  • 是否可哈希,只有可哈希的类型才能作为字典的键。

    可哈希:int/str/tuple/bool    不可哈希:list、dict
  • 是否可变类型

    不可变:int/str/tuple/bool    可变:list、dict

2.函数

函数,一大堆功能代码的集合。

def 函数名():
    代码..
    ...
    ..
    ....
    
函数名()
def info():
    print(123)
    print(456)
    print(999)
    
info()

函数存在的意义?

  • 增强代码的重用性

    def send_email():
        ...
        ....
    
    
    if CPU占用率 > 90%:
        send_email()
        
    if 硬盘使用率 > 85%:
        send_email()
        
    if 内存使用率 >95%:
        send_email()
  • 增加代码的可读性

    def calculate_same_num_rule():
        """判断是否是豹子"""
        pass
    
    def calculate_same_color_rule():
        """判断是否是同花"""
        pass
    
    def calculate_straight_rule():
        """判断是否顺子"""
    	pass
    
    def calculate_double_card_rule(poke_list):
        """判断是否对子"""
    	pass
    
    def calculate_single_card_rule():
        """判断是否单牌"""
        pass
    
    
    
    # 1. 生成一副扑克牌
    card_color_list = ["红桃", "黑桃", "方片", "梅花"]
    card_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]  # A
    all_card_list = [[color, num] for color in card_color_list for num in card_nums]
    
    # 2.洗牌
    random.shuffle(all_card_list)
    
    # 3.给玩家发牌
    ...
    
    # 4.判断牌是:豹子?同花顺?顺子?对子?单点?
    calculate_same_num_rule()
    calculate_same_color_rule()
    calculate_straight_rule()
    ...

2.1 Python发送邮件

之前说了很好多次发送邮件的案例,下面就来教大家用python发邮件,然后再由此引出函数的参数。

  • 注册邮箱

  • 基础配置

    • 授权码

    • SMTP服务器: smtp.126.com

  • 代码发送邮件

# 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()

需求来了

需求1:封装称为函数

def send_email():
    # 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()
    
send_email()

需求2: 两个人发邮件

def send_email1():
    # 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()
    
    

def send_email2():
    # 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", "424662509@qq.com", msg.as_string()) # 自己邮箱/目标邮箱/内容
    server.quit()

send_email1()
send_email2()
def info():
    print(123)
    
info()
def info(x1):
    data = x1 + 100
    print(data)
    
info(1)
info(20)
def send_email1(to):
    # 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'] = to  # 目标邮箱
    msg['Subject'] = "360一天"  # 主题

    # 3.发送邮件
    server = smtplib.SMTP_SSL("smtp.126.com")
    server.login("yangliangran@126.com", "LAYEVIAPWQAVVDEP")  # 账户/授权码
    server.sendmail("yangliangran@126.com", to, msg.as_string()) # 自己邮箱/目标邮箱/内容
    server.quit()
    
send_email("424662508@qq.com")
send_email("424662509@qq.com")

2.2 参数

def do_something(a1,a2,a3):
    pass

do_something(11,22,33)
  • 位置传参

    def do_something(a1,a2,a3):
        res = a1 + a2 + a3
        print(res)
    
    do_something(11,22,33)
  • 关键字传参

    def do_something(a1,a2,a3):
        res = a1 + a2 + a3
        print(res)
    
    do_something(a3=33,a1=11,a2=22)

2.2.1 默认参数
def do_something(a1,a2,a3=10):
    pass

do_something(11,22)
do_something(11,22,33)

注意:定义时,有默认值的参数必须放在最后。

2.2.2 动态参数
def do_something(a1,a2,a3=10):
    pass

do_something(11,22)
  • *

    def do_something(*args):
        # 统一将用户传入的参数搞成一个元组 args=(1,)  args=(1,11)   args=(9,11,123123)
        pass
    do_something(1)
    do_something(1,11)
    do_something(9,11,123123)
  • **

    def do_something(**kwargs):
        # 统一将传入的参数搞成字典:kwargs={"k":1}  kwargs={"v1":1,"x":11}
        pass
    
    do_something(k=1)
    do_something(v1=1,x=11)
    do_something(age=9,xx=11,v1=123123)
  • *,**

    def do_something(*args,**kwargs):
        pass
    
    do_something(11,22)
    do_something(k1=11,k2=22)
    do_something(11,22,k9=999)

2.3 返回值

函数本质上是一大堆代码的集合,函数放在一起目的是为了让他帮助我们完成某些事。

def plus(v1,v2):
    data = v1 + v2 + 100
    return data

value = plus(50,33)
print(value) # 183

注意:函数的返回值和print是两个不同的东西。

关于返回值的三个关键知识点:

  • 返回值可以是任意类型,函数没有返回值,默认返回None

    def f1():
        return [11,22,3]
    res = f1()
    def f2():
        v1 = 100
        v2 = 900
        
    res = f2() # None
  • 在函数中一旦遇到return,立即结束函数的执行。

    def func():
        print(1)
        for i in range(5):
            print(i)
            return 999
        print(2)
        
    res = func()
  • 在函数返回值时,可能会用逗号分开多个值,会打包成元组

    def func():
        return 1,2,"武沛齐"
    
    v1 = func()  # (1,2,"武沛齐")

案例:

  • 定义函数,函数接受一个字符串类型的参数,在函数中计算字符串中有多少个 'a' 字符,统计出来并返回个数。

    def 函数名(参数):
    	pass
    	return 9
    	
    v1 = 函数名("asjdfi;uasdfjkaisdfj;lakjsdfkj;asdfkja;skdjf;;")
    print(v1)
    def char_counter(data_string):
        num = 0
        for char in data_string:
            if char == "a":
                num = num + 1
        return num
    
    
    data = char_counter("阿斯蒂芬卡;sdkfjasduffasdfdafdasfadfasdfsf")
    print(data)

2.4 作用域

# if 1 == 1:
#     name = "root"
# print(name)  # root

# for i in range(10): # [0,1,2,3,..9]
#     pass
# print(i)

python中是以函数为作用域:

def info():
    name = "root"
    print(name)

info()

全局变量 vs 局部变量

# 全局变量
CITY = "上海"


def info():
    # 局部变量
    name = "root"
    print(name)

info()

自己没有,就向上级作用域

# 全部变量
CITY = "上海"


def info():
    # 局部变量
    name = "root"
    print(name)
   
    print(CITY)


info()

global关键字

# 全部变量
CITY = "上海"


def info():
    # 局部变量
    name = "root"
    print(name) # root

    CITY = "北京" # 局部变量
    print(CITY)  # 北京


print(CITY)  # 上海
info()
print(CITY)
# 全局变量
CITY = "上海"


def info():
    # 局部变量
    name = "root"
    print(name)  # root

    global CITY  # 全局变量CITY
    CITY = "北京"  # 全局变量CITY=北京
    print(CITY)  # 北京


print(CITY)  # 上海
info()
print(CITY)

2.5 生成器

# 生成器函数
def func():
    print("进来了")
    yield 11
    print("又来了")
    yield 22
    print("又又来了")
    yield 33


# 调用生成器函数就会得到一个生成器对象
gen = func()

v1 = next(gen)
print(v1)

v2 = next(gen)
print(v2)

v3 = next(gen)
print(v3)

next(gen)
# 生成器函数
def func():
    yield 11
    yield 22
    yield 33


# 调用生成器函数就会得到一个生成器对象
gen = func()

for item in gen:
    print(item)

# 生成 1000w个连续的数字
num_list = []
for item in range(10000000):
    num_list.append(item)
def create_big_num(max_num):
    num = 0
    while True:
        yield num
        if num == max_num:
            return
        num = num + 1


obj = create_big_num(100000)
for item in obj:
    print(item)

2.6 装饰器

# 从函数中返回函数
def hi(name="yasoob"):
    def greet():
        return "now you are in the greet() function"
    def welcome():
        return "now you are in the welcome() function"
    if name == "yasoob":
        return greet
    else:
        return welcome
a = hi()
print(a)
# 函数做为参数传递
def new_decorator(a_func):
    def wrapTheFunction():
        print("before")
        a_func()
        print("after")
    return wrapTheFunction

def function_require():
    print("I am the function")

function_decoration = new_decorator(function_require)
function_decoration()
# 装饰器语法糖的使用
def new_decorator(a_func):
    def wrapTheFunction():
        print("before")
        a_func()
        print("after")
    return wrapTheFunction

@new_decorator
def function_require():
    print("I am the function")

# function_decoration = new_decorator(function_require)
# function_decoration()
function_require()

装饰器的了解:

  • 定义装饰器

def outer(func):
    def inner():
        print("before")
        res = func()  # 被装饰器的原函数
        print("after")
        return res
    return inner
@outer
def info3():
    print("原来的info函数")
​​​​​​​info3()
  • 有参数的装饰器

def mylog(type):
    def decorate(fun):
        def inner(*args,**kwargs):
            if type=="1":
                print("hello world")
            else:
                print("1")
                fun(*args,**kwargs)
                print("2")
        return inner
    return decorate


@mylog("2")
def test(a,b):
    print("hello world,{}{}".format(a,b))

test(11,22)

2.7 匿名函数(lambda表达式)

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

v1 = func(1,2)
print(v1) # 3
func = lambda a1,a2 : a1 + a2

v2 = func(1,2)
print(v2) # 3

对于简单的函数可以做的简写。

def func(a1,a2):
	# 1.打开Excel文件
    # 2.读取内容
    ...
    return a1 + a2

2.8 异常

  •  Raise的用法
def divideNumbers(num1, num2):
    if(num2 == 0):
        raise Exception('分母不能为空')
    return num1 / num2
# 调用函数
try:
    result = divideNumbers(10, 0)
except Exception as e:
    print(e)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值