1. 初识函数

  • 面向过程编程 :按照业务逻辑从上到下逐步完成
  • 函数式编程 :利用函数编程

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

def 函数名():
    函数内编写代码
    ...
    ...
函数名()


def info():
    print("line1")
    print("line2")
    print("line...")
    
    
info()	# 执行函数

应用场景

  • 重复代码
def send_email():
    pass

if cpu占用率 > 90%:
    send_email()
if 硬盘使用率 > 90%:
    send_email()
if 内存使用率 > 90%:
    send_email()
  • 代码太长
import random


def calculate_same_num_rule():
    """判断是否是豹子"""
    pass
def calculate_same_color_rule():
    """判断是否是同花"""
    pass
def calculate_straigt_rule():
    """判断是否是顺子"""
    pass
def calculate_double_card_rule(poke_list):
    """判断是否是对子"""
    pass
def calculate_single_card_rule():
    """判断是否是单牌"""
    pass

# 1. 生成扑克牌
card_color_list = ["红桃","黑桃","方片","梅花"]
card_num = [2,3,4,5,6,7,8,9,10,11,12,13,14]
all_card_list = [[color,num] for color in card_color_list for num in card_num]

# 2. 洗牌
random.shuffle(all_card_list) # 将列表打乱

# 3. 给玩家发牌
...

# 4. 判断玩家牌型
calculate_same_num_rule()
calculate_same_color_rule()
...

2. 函数的参数

通过使用python发邮件来了解函数的参数

需要准备:

  • 授权码:QDZJCKKEJRWNPIAK
  • SMTP服务器:smtp.163.com

发邮件函数

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr


def send_email(receiver):  # 传入一个参数做收件人
    """邮件内容配置"""
    # 邮件文本
    msg = MIMEText('这是一封测试邮件,请忽略', 'html', 'utf-8')
    # 邮件上显示的发件人
    msg['From'] = formataddr(['zhangsan', 'xxx@163.com'])
    # 邮件上显示的主题
    msg['Subject'] = '测试邮件'

    """发送邮件"""
    server = smtplib.SMTP_SSL('smtp.163.com')
    server.login('lvdan0427@163.com', 'QDZJCKKEJRWNPIAK')
    server.sendmail('lvdan0427@163.com', receiver, msg.as_string())  # 我的邮箱,要发送的邮箱(引入参数),邮件的内容
    server.quit()


# 根据上述代码实现给三个用户发邮件

v1 = 'xx@163.com'
v2 = 'xxx@qq.com'
v3 = 'xxx@qq.com'

# 填写代码
send_email(v1)
send_email(v2)
send_email(v3)

2.1 参数

在定义函数时,如果在括号中添加变量,我们称它为函数的形式参数

  • 位置传参
def func(a1, a2, a3):
    print(a1 + a2 + a3)


# 执行函数并传入参数 (执行函数传值时一般称为实际参数-实参)
func(11, 22, 33)
  • 关键字传参
def func(a1, a2, a3):
    print(a1 + a2 + a3)


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


func(11, a3=33, a2=22)

2.2 默认参数

def func(a1, a2, a3=10):
    print(a1 + a2 + a3)


# 位置传参
func(2, 4)
func(2, 4, 6)

# 关键字传参(位置传参和关键字传参混用时,关键字传参要放在后面)
func(2, a2=4)
func(a2=4, a3=6, a1=2)

2.3 动态参数

  • *args
def func(*args):           # args不是固定的,也可以指定别的动态参数,例如 *a1
    print(args)            # (1,2,'a') 元组类型,无论传多少参数都可以,不传时为空元组()
    print(args[0])         # 1 元组的方式取值
    
# * 动态参数只能按位置传参
func(1,2,'a')
  • **kwargs
def func(**kwargs):        # kwargs不是固定的,也可以指定别的动态参数,例如 **a1
    print(kwargs)          # {'name': '邵冲', 'age': '25', 'email': 'xxx@163.com'} 字典类型,无论传多少参数都可以,不传时为空元组{}
    print(kwargs['name'])  # '邵冲' 字典的方式取值


# ** 动态参数只能按关键字传参
func(name='邵冲', age='25', email='xxx@163.com')
# 传参时会自动把参数转换为元组或字典
def func(*args, **kwargs):  # args不是固定的,也可以指定别的动态参数,例如 *a1
    print(args, kwargs)


func()
# args=(),kwargs={}

func(11, 22, 33)
# args=(11,22,33),kwargs={}

func(name='邵冲', age='25', email='xxx@163.com')
# args=(),kwargs={'name': '邵冲', 'age': '25', 'email': 'xxx@163.com'}

func(11, 22, 33, name='邵冲', age='25', email='xxx@163.com')
# args=(11,22,33),kwargs={'name': '邵冲', 'age': '25', 'email': 'xxx@163.com'}

注意事项:

# 1. ** 必须放在 * 的后面
def func(*args, **kwargs): pass

# 2. 参数和动态参数混合时,动态参数只能放在最后
def func(a1, a2, a3, *args, **kwargs): pass

# 3. 默认参数和动态参数同时存在时,默认参数放在 ** 的前面
def func(a1, a2, a3, a4=10, *args, a5=20, **kwargs): pass

3. 函数的返回值

有时我们希望函数可以帮助我们实现某个功能,但让函数实现某个功能之后也需要有一些结果反馈给我们

return:函数执行完成后将执行结果返回给我们

import requests
from xml.etree import ElementTree as ET


def xml_to_list(city):
    data_list = []
    url = "http://ws.webxml.com.cn//WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName={}".format(city)
    res = requests.get(url=url)
    root = ET.XML(res.text)
    for node in root:
        data_list.append(node.text)
    return data_list


result = xml_to_list('北京')
print(result)  # ['直辖市', '北京', '54511', '54511.jpg', '2022/3/17 22:55:57', '-1℃/3℃', '3月17日 小雪转阴'...]
  • 返回值可以是任意类型,如果函数中没有return,则默认返回None
def func():
    value = 1 + 1


result = func()
print(result)  # None
  • return后面的值如果有逗号,则默认会将返回值转换成元组再返回
def func():
    return 1, 2, 'a'


result = func()
print(result)  # (1, 2, 'a')
  • 函数一旦遇到return就会立即退出函数 (终止函数中的所有代码)
def func():
    print(1)	   # print(1)
    return "done"  # return "done",不再往下执行
    print(2)	   # 不执行


ret = func()

4. 练习题

  1. 定义一个函数,用于计算一个字符串中 a 出现的次数并通过return返回
def func(data):
    count = 0
    for item in data:
        if item == "a":
            count += 1
    return count


res = func(data='1a2bcaaa')
print(res)  # 4
  1. 写函数,判断用户传入的一个值(字符串或列表或元组任意) 长度是否大于5,并返回真假
def data_length(data):
    if len(data) > 5:
        return True
    return False


res = data_length(123456765432)
print(res)  # True
  1. 写函数,接收两个数字参数,并返回比较大的数字
def get_bigger(num1, num2):
    if num1 > num2:
        return num1
    return num2


res = get_bigger(33, 22)
print(res)  # 33
  1. 写函数,接收四个参数分别是:姓名,性别,年龄,学历,然后将这四个值通过"*"拼接起来并追加到一个student_msg.txt中
def write_file(name, gender, age, degree):
    data_list = [name, gender, age, degree]
    data = "*".join(data_list)
    with open('files/student_msg.txt', mode='a', encoding='utf-8') as file_object:
        file_object.write(data)


write_file("小明", "男", "10", "小学生")
  1. 补充代码实现功能
  • [位置1] 读取文件中的每一行数据,将包含特定关键字的数据筛选出来,并以列表的形式返回
  • [位置1] 文件不存在则返回None
  • [位置2] 文件不存在,输出'文件不存在',否则循环输出匹配成功的每一行数据
import os


def select_content(file_path, key):
    # 补充代码 [位置1]
    if not os.path.exists(file_path):
        return
    data_list = []
    with open(file_path, mode='r', encoding='utf-8') as file_object:
        for line in file_object:
            if key in line:
                data_list.append(line.strip())
    return data_list


res = select_content("files/student_msg.txt", "小明")

# 补充代码 [位置2]
print(res)
  1. 补充代码,实现敏感词替换的功能
def change_string(origin):
    # 补充代码,将字符串origin中的敏感词替换为 '**',最后将替换好的值返回
    data_list = ["傻子", "傻瓜", "笨蛋","傻蛋"]
    for item in data_list:
        origin = origin.replace(item,"**")
    return origin

text = input("请输入内容: ")
result = change_string(text)
print(result)

>>>
# 请输入内容: 傻瓜笨瓜傻瓜笨蛋傻蛋
# **笨瓜******
  1. 基于函数实现用户认证
  • 写函数,读取用户信息并构造为字典(用户信息存放在files/user.xlsx文件中)user.xlsx
    image-20220318160034721.png
  • 用户输入用户名和密码,进行校验 (且密码都是密文,所有需要将用户输入的密码进行加密,然后再与Excel中的密文密码进行比较)
import hashlib
from openpyxl import  load_workbook

def get_user_dict():
    user_dict = {}
    wb = load_workbook('files/user.xlsx')
    sheet = wb.worksheets[0]
    for row in sheet.rows:
        user_dict[row[1].value] = row[2].value
    return user_dict

def encrypt(origin):
    origin_bytes = origin.encode('utf-8')
    md5_object = hashlib.md5()
    md5_object.update(origin_bytes)
    return md5_object.hexdigest()

user = input("请输入用户名:")
pwd = input("请输入密码:")
encrypt_password = encrypt(pwd)
user_dict = get_user_dict()
db_password = user_dict.get(user)
# db_password = user_dict[user]
if encrypt_password == db_password:
    print("登录成功")
else:
    print("登录失败")
posted on 2023-10-20 16:48  龙泉寺老方丈  阅读(22)  评论(0)    收藏  举报