【MK】Python全栈 阶段一:习题汇总 九:常用函数与高阶函数

这篇博客整理了Python全栈学习中关于常用函数和高阶函数的习题,包括单选题、多选题和编程题,涉及hashlib加密、base64编码、日志模块、虚拟环境、迭代器和高阶函数等知识点。通过练习,帮助读者巩固这些概念并提高编程能力。
摘要由CSDN通过智能技术生成

版权声明:本文为博主原创文章,未经博主允许不得转载。



一、单选题

1.当用户输入2018001时,即number值为2018001,执行print()函数,输出结果为( B

number = input('请输入您的学号:')
print(type(number))
  • A .<class ‘int’>
  • B .<class ‘str’>
  • C .<class ‘bool’>
  • D .<class ‘float’>

2.关于迭代器获取数据,下列描述错误的是( D

  • A .next()返回容器中的下一个值,如果容器中没有更多元素,则抛出StopIter
  • B .可以使用for…in…循环获取迭代器数据
  • C .可以使用next()方法得到迭代器中的值
  • D .当我们已经迭代完最后一个数据之后,再次调用next()函数时程序停止,不用再执行next()函数了

3.请看下面的程序代码,运行结果为:(B

list_1 = map(str, [1,2,3,4])
print(list(list_1))
  • A .[1, 2, 3, 4]
  • B .[‘1’, ‘2’, ‘3’, ‘4’]
  • C .None
  • D .程序报错

4.根据下列图示代码,推断控制台打印结果与选项中哪一项相一致(A

from functools import reduce

def my_func(x, y):
    return x + y

ages = [12,13,11,19,20]
res = reduce(my_func, ages)
print(res)
  • A .75
  • B . [75,]
  • C . [25,30,20]
  • D .12+13+11+19+20

5.X

  • A .
  • B .
  • C .
  • D .

二、多选题

1.关于日志的作用及等级下列描述正确的是(A D

  • A .日志可以用于记录一些程序在执行过程中的报错信息
  • B .日志是不分等级的,所有的都是同级别的 【分等级】
  • C .日志在程序开发过程中没有实际作用的 【错】
  • D .日志的等级包括error,warnning等

三、练习题

3.1 加密模块:hashlib

一、难破解、不可逆

# coding: utf-8

import hashlib
import time

# 基础签名
base_sign = 'muke'

def custom():
    # 时间戳:浮点类型
    a_timestamp = int(time.time())
    _token = '%s%s'%(base_sign, a_timestamp)
    # 生成 hashlib 对象
    hashobj = hashlib.sha1(_token.encode('utf-8'))
    # 生成 a的真实token :生成16进制加密串
    a_token = hashobj.hexdigest()
    return a_token, a_timestamp

# token:请求帮服务的认证token
# timestamp:请求帮生成token的时间戳
def b_service_check(token, timestamp):
    _token = '%s%s'%(base_sign, timestamp)
    b_token = hashlib.sha1(_token.encode('utf-8')).hexdigest()
    if token == b_token:
        return True
    else:
        return False

if __name__ == '__main__':
    need_help_token, timestamp = custom()
    # result = b_service_check(need_help_token, timestamp)

    time.sleep(1)
    result = b_service_check(need_help_token, int(time.time()))   # 执行速度太快,浮点转为整形
    if result == True:
        print('a合法,b服务可以进行帮助')
    else:
        print('a不合法,b不可进行帮助')

二、总结
(1)hashlib 模块主要用于加密相关的操作,里面含有很多常用的加密算法,如:SHA1,SHA224,SHA256,SHA384,SHA512,MD5等
(2)加密需要先实例化MD5对象,再将字符串转成 bytes 类型进行加密,注意:加密必须是 bytes 类型,不能直接对字符串进行加密

import hashlib
# md5
m = hashlib.md5()  # 实例化 md5对象
m.update('imooc'.encode())  # 'imooc'.encode() 把字符串转成 bytes 类型
print(m.hexdigest())

# sha1
s1 = hashlib.sha1()
s1.update('imooc'.encode('utf-8'))
print(s1.hexdigest())

# sha256
s256 = hashlib.sha256()
s256.update('imooc'.encode('utf-8'))
print(s256.hexdigest())

# sha224
s224 = hashlib.sha224()
s224.update('imooc'.encode('utf-8'))
print(s224.hexdigest())

# sha384
s384 = hashlib.sha384()
s384.update('imooc'.encode('utf-8'))
print(s384.hexdigest())

# sha512
s512 = hashlib.sha512()
s512.update('imooc'.encode('utf-8'))
print(s512.hexdigest())

3.1 加密模块:base64

方式一

import base64

# 加密
def encode(data):
    if isinstance(data, str):
        data = data.encode('utf-8')
    elif isinstance(data, bytes):
        data = data
    else:
        raise TypeError('data need bytes or str')
    return base64.encodebytes(data).decode('utf-8')

# 解密
def decode(data):
    if not isinstance(data, bytes):
        raise TypeError('data need bytes')
    return base64.decodebytes(data).decode('utf-8')


if __name__ == '__main__':
    result = encode('hello xiaomu')
    print(result)

    new_result = decode(result.encode('utf-8'))
    print(new_result)

方式二:对加密的字符串进行二次输出

import base64

replace_one = '%'
replace_two = '$'

# 加密
def encode(data):
    if isinstance(data, str):
        data = data.encode('utf-8')
    elif isinstance(data, bytes):
        data = data
    else:
        raise TypeError('data need bytes or str')
    _data = base64.encodebytes(data).decode('utf-8')
    _data = _data.replace('a', replace_one).replace('2', replace_two)
    return _data

# 解密:注意比特类型转换
def decode(data):
    if not isinstance(data, bytes):
        raise TypeError('data need bytes')

    replace_one_b = replace_one.encode('utf-8')
    replace_two_b = replace_two.encode('utf-8')

    data = data.replace(replace_one_b, b'a').replace(replace_two_b, b'2')

    return base64.decodebytes(data).decode('utf-8')

if __name__ == '__main__':
    result = encode('hello xiaomu')
    print(result)

    new_result = decode(result.encode('utf-8'))
    print(new_result)

方式三、总结
Base64 是一种用64个字符来表示任意二进制数据的方法,可用来将非ASCII 字符的数据转换成ASCII字符,是一种可逆的编码方式。写法如下:

import base64

# 'imooc'.encode() 将字符串变成二进制
res = base64.b64encode('imooc'.encode())  # base64编码

# res.decode() 把 bytes 转成 字符串
jie_mi_res = base64.b64decode(res.decode())  # base64 解码

print(jie_mi_res.decode())

3.2 日志模块

一、简单练习

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s',
    filename='back.log',
    filemode='w'
)

logging.info('这是第一个记录的日志信息')
logging.warning('这是一个警告')
logging.error('这是一个重大的错误信息')
logging.debug('这是一个debug')

print(logging.debug)
print(logging.warning)
print(logging.error)
print(logging.warn)
print(logging.ERROR)
print(logging.WARN)
print(logging.DEBUG)

二、函数封装

import logging
import os

def init_log(path):
    # 做验证
    if os.path.exists(path):
        mode = 'a'   # 如果日志文件存在,则追加
    else:
        mode = 'w'   # 如果日志文件不存在,则创建
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s',
        filename=path,
        filemode=mode
    )
    return logging

current_path = os.getcwd()
path = os.path.join(current_path, 'back.log')
log = init_log(path)

log.info('这是第一个记录的日志信息')
log.warning('这是一个警告')
log.error('这是一个重大的错误信息')
log.debug('这是一个debug')

3.3 虚拟环境

# 以下操作需在终端执行:

# 安装:pip install virtualenv

# 创建Python 3.6 的虚拟环境:virtualenv -p python3.6 env3.6

# 进入到 Python 3.6的环境:./env3.6/bin/activate    错误提示:source ./env3.6/bin/activate

# 退出虚拟环境:deactivate

# 回到以前创建的虚拟环境:关闭终端,重新打开

3.4 常用函数集合

# 绝对值
print(abs(-10))

#  判断列表内容是否全是 true
result = all(['', 'a' in 'abc', True, None])   # ''、None 属于 False 范畴
print(result)

result_02 = all([True, '1', 10, len('abc')])
print(result_02)

# 迭代时记录索引
python = ['django', 'flask', 'tornado']
for index, item in enumerate(python):
    print(index, item)

# input
food = input('您想吃什么:')
print(food)

# help
# print(help(input))
# print(help(list))

# vars
class Test(object):
    a = 1
    b = 2
    def __init__(self):
        self.a = self.a
        self.b = self.b
test = Test()
print(test.a)
print(test.b)
result = vars(test)
print(result)

# hasattr
print(hasattr(test, 'a'))
print(hasattr(test, 'c'))
print(hasattr(list, 'append'))

# setattr
setattr(test, 'c', 3)
print(test.c)
print(vars(test))

# setattr(list, 'c', 1)
if hasattr(list, 'append'):
    print(getattr(list, 'append'))
else:
    print('不存在')

# any:判断内容是否有True值
a = ['', None, True, 0]
print(any(a))

# all ——————> and
# any ——————> or

# 练习
number = input('请输入您的学号:')
print(type(number))

3.5 案例:使用random进行抽奖

一、简单的抽奖系统

import random

gifts = ['iphone', 'ipad', 'car', 'TV']

def choice_gifts():
    gift = random.choice(gifts)
    print('您得到了%s'%gift)
    
if __name__ == '__main__':
    choice_gifts()

二、增加中奖概率

import random

gifts = ['iphone', 'ipad', 'car', 'TV']

def choice_gift_new():
    count = random.randrange(0,100,1)
    if 0 <= count <= 50:
        print('您中了一个iphone!!!')
    elif 50 < count <= 70:
        print('您中了一个ipad!!!')
    elif 70 < count < 90:
        print('您中了一个TV电视!!!')
    elif count >= 90:
        print('您中了一辆汽车!!!')

if __name__ == '__main__':
    choice_gift_new()

3.6 迭代器

一、

iter_obj = iter((1, 2, 3))

print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))   # 报错

二、

iter_obj = iter((1, 2, 3))

def _next(iter_obj):
    try:
        return next(iter_obj)
    except StopIteration:
        return None

print(_next(iter_obj))
print(_next(iter_obj))
print(_next(iter_obj))
print(_next(iter_obj))

三、

iter_obj = iter((1, 2, 3))

for i in iter_obj:
    print(i)    

四、

def make_iter():
    for i in range(10):
        yield i

iter_obj = make_iter()    # 迭代器
print(type(iter_obj))

for i in iter_obj:
    print(i)
print('——————————————————')
for i in iter_obj:
    print(i)

五、

# 创建迭代器对象
iter_obj = (i for i in range(10))

for i in iter_obj:
    print(i)
    
print('===========================================')

for i in iter_obj:
    print(i)

3.7 高阶函数

一、

from functools import reduce

res_f = filter(lambda x: x>1, [1,2,3])
print(list(res_f))

res_m = map(lambda x: x>1, [1,2,3])
print(list(res_m))

res_r = reduce(lambda x,y: x+y, [0,1,2])
print(res_r)

二、

from functools import reduce

# 一
frunts = ['apple', 'banana', 'orange']
result = filter(lambda x: 'e' in x, frunts)
print(list(result))

# 二
def filter_func(item):
    if 'e' in item:
        return True
result = filter(filter_func, frunts)
print(list(result))

# 三
map_result = map(filter_func, frunts)
print(list(map_result))

# 四
reduce_result = reduce(lambda x,y: x+y, [0,1,2])
print(reduce_result)

# 五
reduce_result_str = reduce(lambda x, y: x+y, frunts)
print(reduce_result_str)

四、编程题

4.1 filter

1、要求

  • 使用filter函数,求0-50以内(包括50)的偶数
  • [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44,46, 48, 50]

2、任务

  • 定义use_filter函数
  • 函数体内:实现过滤偶数值的功能

3、任务提示

  • 使用变量data接收0-50(包含50)的数字,即list(range(51))

4、代码实现:usefilter.py

def use_filter(data):
	# 使用result接收filter过滤偶数值的功能
	result =
	return result
if __name__ == '__main__':
	# 使用data接收0-50的数值
	data =
	# 调用use_filter函数传入data,使用result变量接收
	result =
	print(list(result))

4.2 map

1、要求

  • 使用map函数,求元组 (2,4,6,8,10,12)中各个元素的5次方

2、任务

  • pow_five函数体内:计算元素的5次方
  • 调用pow_five函数传入data,使用result接收

3、任务提示

  • pow(x,y) 方法返回 x的y次方的值
  • 计算结果:(32, 1024, 7776, 32768, 100000, 248832)

4、代码实现:usemap.py

def pow_five(data):
	# 计算元素的5次方
	result =
	return result
if __name__ == '__main__':
	data = (2,4,6,8,10,12)
	# 调用pow_five函数传入data,使用result接收
	result = map()
	print(tuple(result))

4.3 reduce

1、要求

  • 请运用reduce函数,计算20的阶乘,并于终端打印计算结果(如下)
  • 2432902008176640000

2、任务

  • 定义use_reduce函数
  • 函数体内:实现某个数值的阶乘

3、任务提示

  • 结合list和range函数实现1-20(包含20)的数值即list(range(1,21))
  • 20的阶乘为12345*…*20

4、代码实现:reduce.py

# 从functools 中导入reduce函数
def use_reduce(x, y):
	# 使用result接收两个数的乘积
	result =
	return result
if __name__ == '__main__':
	# 使用data接收一个1-20的数值
	data =
	# 调用use_reduce函数传入data
	result = reduce()

4.4 作业

1、要求

根据现实生活中的猜数字游戏的游戏规则,运用Python语言模拟实现猜数字游戏的的基本功能,请学员们参考真实的猜数字游戏规则和如下的程序运行效果图进行代码编写,以实现“数字猜猜猜”小游戏的基本功能。游戏规则介绍如下:

  • 1、玩家根据提示进行数字区间起始位置和终止位置的输入
  • 2、依据 1 中输入的数字区间,产生该区间内一个随机数,用于进行猜测比对的终值
  • 3、提示用户输入所猜测的数字,与 2 中产生的随机数字进行比对,并将相应的信息写入指定的日志文件(日志文件名称:record.txt;日志文件路径:与.py文件处于同一级目录)
  • 4、依据 3 中的比对结果。若两者不等,打印友好提示,重复 3、4 步骤;若两者相等,则退出该函数,执行下列语句
  • 5、当猜测的值不在指定区间内时,不需要统计次数和记录
  • 6、打印如效果图所示,用以提示游戏结束的信息

2、运行效果图
在这里插入图片描述
在这里插入图片描述

3、任务描述

4、代码实现

在这里插入代码片

版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InitialHeart2021

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值