首页 > 编程语言 >python基础-函数与模块2

python基础-函数与模块2

时间:2023-10-20 16:56:16浏览次数:40  
标签:return 函数 python 模块 func print data def

目录

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(['邵冲', '[email protected]'])
    # 邮件上显示的主题
    msg['Subject'] = '测试邮件'

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


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

v1 = '[email protected]'
v2 = '[email protected]'
v3 = '[email protected]'

# 填写代码
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': '[email protected]'} 字典类型,无论传多少参数都可以,不传时为空元组{}
    print(kwargs['name'])  # '邵冲' 字典的方式取值


# ** 动态参数只能按关键字传参
func(name='邵冲', age='25', email='[email protected]')
# 传参时会自动把参数转换为元组或字典
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='[email protected]')
# args=(),kwargs={'name': '邵冲', 'age': '25', 'email': '[email protected]'}

func(11, 22, 33, name='邵冲', age='25', email='[email protected]')
# args=(11,22,33),kwargs={'name': '邵冲', 'age': '25', 'email': '[email protected]'}

注意事项:

# 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("登录失败")

标签:return,函数,python,模块,func,print,data,def
From: https://www.cnblogs.com/ican97/p/17777476.html

相关文章

  • python基础-面向对象3
    目录1.继承补充1.1mro和c3算法1.2py2和py3继承区别2.内置函数补充3.异常处理3.1异常细分3.2自定义异常和抛出异常3.3finally和else3.3.1特殊的finally3.3.2else3.3.3traceback3.4异常练习题4.反射4.1一切皆对象4.2import_module+反射5.练习题1.继承补充......
  • python基础-面向对象2
    目录1.成员1.1变量1.2方法1.3属性2.成员修饰符3.对象嵌套4.特殊方法5.练习题1.成员面向对象中的所有成员如下:变量实例变量类变量方法绑定方法类方法静态方法属性1.1变量实例变量,属于对象,每个对象中各自维护自己的数据类变量,属于类,可以被所有对象......
  • python基础-数据类型(字符串-布尔-整数)
    目录1.整数(int)1.1定义1.2独有功能1.3公共功能1.4转换1.5其他1.5.1长整型1.5.2地板除1.5.3其它2.布尔(bool)2.1定义2.2独有功能2.3公共功能2.4转换2.5其他做条件自动转换3.字符串(str)3.1定义3.2独有功能3.2.1练习题3.3公共功能3.4转换3.5其他4.练习题......
  • python异常处理else和finally的区别
    Python3错误和异常|菜鸟教程(runoob.com)try/except...elsetry/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的except子句之后。else子句将在try子句没有发生任何异常的时候执行。以下实例在try语句中判断文件是否可以打开,如果打开文......
  • 函数的定义
    函数的定义函数更多的是一种思想,他不是一种技术定义函数的方式'''def函数名():#定义阶段(造车轮阶段) """函数注释写在这里"""#函数相当于工具,注释相当于工具的说明书 <代码块>#使用函数名()#调用阶段(开车阶段)'''定义阶段不执行函数体代码,只检测语法deffun......
  • 函数基础小结
    函数基础小结计算机的组成之编程什么是编程语言什么是编程为什么要编程计算机的五大组成部分CPU内存外存输入设备输出设备32位和64位多核CPU应用程序的启动机械硬盘的工作原理计算机操作系统什么是文件什么是应用程序操作系统有什么用计算机的三大组成硬件操......
  • Mac OS安装Python的pip
    最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。)原因为他的python没有numpy这个库(这个故事很典)。然鹅雪上加霜的是,他的电脑是Mac,没有Windows的cmd...牛牛还没碰过苹果电脑,后面通过查找百度发现在苹果里这玩意儿叫Terminal,经历千辛万苦打开Terminal并开始pip后,......
  • 【Python&GIS】基于Python批量合并矢量数据
    ​老样子最近有项目需要将N个矢量文件合并成一个,总不能用ArcGIS一个个导入吧。所以我就想着用Python编个程序实现批量合并矢量。我之前也发了一些关于Python操作矢量数据的文章:【Python&GIS】Python处理矢量数据的基本操作(查询、修改、删除、新建),如果大家感兴趣可以去我的主......
  • Python深浅拷贝
    Python深浅拷贝拷贝/浅拷贝/深拷贝只针对可变数据类型拷贝(赋值)当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值lt=[1,2,3]lt2=ltlt.append(4)print(lt)#因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化print(l......
  • python设置代理ip,动态代理IP有哪些优势?
    在网络爬虫开发中,使用代理IP是非常常见的技巧,Python作为一门强大的编程语言,也提供了很多方法来使用代理IP,下面,我将就如何在Python中使用代理IP进行详细的阐述,并举例说明,需要的朋友可以参考下。1.方法一:使用urllib模块Python中最基础的网络请求是使用urllib模块,我们可以利用它来使......