铁乐学Python_day12_作业

1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组

例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]


def poker():
    suit = [‘红心‘, ‘梅花‘, ‘黑桃‘, ‘方片‘]
    count = [i for i in range(2, 11)]
    king = [‘J‘, ‘Q‘, ‘K‘, ‘A‘]
    poker_list = count + king
    li = []
    for key in suit:
        for value in poker_list:
            li.append((key, value))
    return li

print(poker())
print(len(poker()))

2.写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

例如:min_max(2,5,7,8,4)

返回:{‘max’:8,’min’:2}

def min_max(*args):
    a = max(args)
    b = min(args)
    dic = {‘max‘:a, ‘min‘:b}
    return dic

print(min_max(2))

3.写函数,专门计算图形的面积

其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积

调用函数area(‘圆形’,圆半径) 返回圆的面积

调用函数area(‘正方形’,边长) 返回正方形的面积

调用函数area(‘长方形’,长,宽) 返回长方形的面积

答:
# 感觉本题考的主要是嵌套函数内的参数传递,先从最内函数去倒推会容易得到答案。
def area(patter, *args):
    if patter == ‘长方形‘:
        # 计算长方形面积
        def rectangle(a, b):
            S = a * b
            return S
        return rectangle(*args)

    if patter == ‘正方形‘:
        # 计算正方形面积
        def quadrate(a):
            S = a * a
            return S
        return quadrate(*args)

    if patter == ‘圆形‘:
        # 计算圆形面积
        def roundness(r):
            S = 3.14 * r * r
            return S
        return roundness(*args)

print(area(‘长方形‘, 4, 8))
print(area(‘正方形‘, 12))
print(area(‘圆形‘, 6))

验证:
32
144
113.03999999999999

另一种写法如下,所有def定义在前面,内存中能找到相应函数名对应的函数,之前试过写if在前面的结果找不到对应的函数,所以报错了。

def area(patter, *args):

    # 计算长方形面积
    def rectangle(a, b):
        S = a * b
        return S

    # 计算正方形面积
    def quadrate(a):
        S = a * a
        return S

     # 计算圆形面积
    def roundness(r):
        S = 3.14 * r * r
        return S

    if patter == ‘正方形‘:
        return quadrate(*args)
    if patter == ‘长方形‘:
        return rectangle(*args)
    if patter == ‘圆形‘:
        return roundness(*args)

print(area(‘长方形‘, 5, 8))
print(area(‘正方形‘, 11))
print(area(‘圆形‘, 7))

验证:
40
121
153.86

4.写函数,传入一个参数n,返回n的阶乘

例如:cal(7)

计算7654321

答:使用递归的方式
def cal(n):
    if n == 1:
        return 1
    return n * cal(n - 1)

print(cal(7))

5040

5、编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果(升级题)

5.1.为题目3编写装饰器,实现缓存网页内容的功能:(升级题)

具体:实现下载的页面存放于文件中,如果网页有对应的缓存文件,就优先从文件中读取网页内容,否则,就去下载,然后存到文件中

6、给每个函数写一个记录日志的功能,

功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。

所需模块:

import time

struct_time = time.localtime()

print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

答:

from functools import wraps
import time

def timer(func):
    @wraps(func)
    def inner(*args, **kwargs):
        with open(‘log.txt‘, encoding=‘utf-8‘, mode=‘a‘) as f1:
            struct_time = time.localtime()
            timesession = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
            name = func.__name__
            f1.write(‘\n函数名称:{}\t\t时间节点:{}‘.format(name, timesession))
        ret = func(*args, **kwargs)
        return ret
    return inner

@timer
def hello():
    print(‘hello word‘)

@timer
def my_name(name):
    print(‘my name is %s‘ % name)

# 验证
hello()
my_name(‘wutiele‘)

# 打开log.txt可以看到己生成下列两行记录

函数名称:hello      时间节点:2018-04-02 19:04:05
函数名称:my_name    时间节点:2018-04-02 19:04:05

7、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。

答:

def auth(func):
    def inner(*args, **kwargs):
        # 引入全局变量flag
        global flag
        if flag:
            username = input("请输入用户名:").strip()
            password = input("请输入密码:").strip()
            with open(‘auth.txt‘, encoding=‘utf-8‘, mode=‘r‘) as f1:
                for i in f1:
                    li = i.strip().split()
                    if username == li[0] and password == li[1]:
                        print(‘登录成功‘)
                        # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                        flag = False
                        ret = func(*args, **kwargs)
                        return ret
                # 循环验证完毕之后再报验证失败
                else:
                    print(‘验证失败‘)
                    return
        else:
            ret = func(*args, **kwargs)
        return ret
    return inner

flag = True
@auth
def hello():
    print(‘hello word,hello hero.‘)

@auth
def my_name(name):
    print(‘my name is %s‘ % name)

# 验证
hello()

my_name(‘tiele‘)

hello()

# 效果:

请输入用户名:test
请输入密码:234
验证失败            # 执行第一个函数验证失败,于是到第二个时又再进行认证
请输入用户名:伍天
请输入密码:123567
登录成功                # 第二个函数认证通过,接下来的第三个函数直接执行
my name is tiele
hello word,hello hero.  # 第三个函数直接执行了,不需要认证。

8,再编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:

设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。

设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。

循环打印四个选项:京东首页,京东超市,淘宝首页,淘宝超市。

供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。

相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

答:

def auth2(model):
    ‘‘‘
    由于装饰器需带参数,故嵌套三层函数。
    :param model: 供选择jingdong或taobao
    :return:
    ‘‘‘
    def auth(func):
        def inner(*args, **kwargs):
            # 引入全局变量flag
            global flag
            if flag and model == ‘jingdong‘:
                username = input("请输入用户名:").strip()
                password = input("请输入密码:").strip()
                with open(‘auth_JD.txt‘, encoding=‘utf-8‘, mode=‘r‘) as f1:
                    for i in f1:
                        li = i.strip().split()
                        if username == li[0] and password == li[1]:
                            print(‘登录成功‘)
                            # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                            flag = False
                            ret = func(*args, **kwargs)
                            return ret
                    # 循环验证完毕之后再报验证失败
                    else:
                        print(‘验证失败‘)
                        return
            elif flag and model == ‘taobao‘:
                username = input("请输入用户名:").strip()
                password = input("请输入密码:").strip()
                with open(‘auth_TB.txt‘, encoding=‘utf-8‘, mode=‘r‘) as f1:
                    for i in f1:
                        li = i.strip().split()
                        if username == li[0] and password == li[1]:
                            print(‘登录成功‘)
                            # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                            flag = False
                            ret = func(*args, **kwargs)
                            return ret
                    # 循环验证完毕之后再报验证失败
                    else:
                        print(‘验证失败‘)
                        return
            else:
                ret = func(*args, **kwargs)
            return ret
        return inner
    return auth

flag = True
@auth2(model=‘jingdong‘)
def JD_index():
    print(‘from JD index 京东首页‘)
@auth2(model=‘jingdong‘)
def JD_supermark():
    print(‘from JD supermark 京东超市‘)
@auth2(model=‘taobao‘)
def TB_index():
    print(‘from TB index 淘宝首页‘)
@auth2(model=‘taobao‘)
def TB_supermark():
    print(‘from TB supermark 淘宝超市‘)

while True:
    li2 = [‘京东首页‘, ‘京东超市‘, ‘淘宝首页‘, ‘淘宝超市‘]
    for i in range(len(li2)):
        print(i+1, li2[i])
    sn = input("请按序号选择商城:(Q/q退出)").strip()
    if sn.upper() == ‘Q‘:
        break
    elif sn == "1":
        JD_index()
    elif sn == "2":
        JD_supermark()
    elif sn == "3":
        TB_index()
    elif sn == "4":
        TB_supermark()
    else:
        print(‘你的选择有误,请重新选择:‘)
        continue

原文地址:https://www.cnblogs.com/tielemao/p/8719180.html

时间: 2024-07-30 17:34:41

铁乐学Python_day12_作业的相关文章

铁乐学python_day09_作业

练习题 1.整理函数相关知识点,写博客 2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, 并将其作为新列表返回给调用者. def odd_index(l): lis = [] for i in range(len(l)): # 通过range设定索引范围比通过元素找索引要好,因为相同元素返回的索引值会有误 if i % 2 != 0: lis.append(l[i]) return lis # 验证odd_index函数的使用正常不: li = [ i for i in ran

铁乐学Python_day12_装饰器

[函数的有用信息] 例: def login(user, pwd): ''' 功能:登录调用 参数:分别有user和pwd,作用分别是用户和密码: return: 返回值是登录成功与否(True,False) ''' print(user, pwd, "欢迎登录") print(login.__name__) #查看函数名字 print(login.__doc__) #查看函数注释 login 功能:登录调用 参数:分别有user和pwd,作用分别是用户和密码: return: 返回值

铁乐学Python_Day34_Socket模块2和黏包现象

铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必須创建套接字. 可以将它们比作成电话插孔,没有它将无法进行通信. 套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信. 这就是所谓的进程间通信(Inter Process Communication, IPC). 有两种类型的套接字:基于文件的和面向网

铁乐学python_day25_序列化模块

部份内容摘自博客http://www.cnblogs.com/Eva-J/ 回顾内置方法: __len__ len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度 __hash__ hash(obj)的结果依赖于obj.__hash__()的结果,计算对象的hash值 __eq__ obj1 == obj2 的结果依赖于obj.__eq__()的结果,用来判断值相等 __str__ str(obj) print(obj) '%s'%obj 的结果依赖于__str__,用来做

铁乐学python_Day39_多进程和multiprocess模块2

锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理, 但是它们之间的运行没有顺序,一旦开启也不受我们控制. 尽管并发编程能让我们更加充分的利用IO资源,但是也会带来新的问题. 当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 遇到数据.安全比速度重要的场景,我们就需要将进程变回受同步控制. 例: #!/usr/bin/env python # _*_ coding: utf-8 _*_ impo

铁乐学Python_day09_函数

今天我们来学习函数. 产生的原由,若没有函数,会显得重复代码多,可读性差,也会造成重复造轮子的情景. 故产生了函数,用来封装好一个功能,它是以功能为导向的. 1.[函数的样式] 例如自己定义一个函数: def my_len(): def python中的关键字,用来声明和定义一个函数: my_len 函数名,命名规范与变量命名的一样: def与函数名中间要隔一个空格: 函数名+"()"+":",括号加冒号,括号里填的要你想要设置函数调用者传递的参数: 紧接着就是缩进

铁乐学python_day24_面向对象进阶1_内置方法

题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面的四个问题,并了解和实践透彻. 什么是反射? 先不说枯燥的概念,你可以自己总结出来,对于python中的反射,什么时候会用到? 需要使用字符串数据类型的变量名来使用变量的时候用到反射. (通过字符串的形式操作对象相关的属性和方法.) 关键词:字符串 使用到字符串的场景多在: 1)文件中存储的是字符串, 2)网络上能传递的也最接近字符串, 3)用户输入的(用

铁乐学python26_hashlib+configparser+logging模块

大部份内容摘自博客http://www.cnblogs.com/Eva-J/ hashlib模块算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? 摘要算法又称哈希算法.散列算法. 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest, 目的是为了发现原始数据是否被人篡改过. 摘要算法之所以能指出数据是否被篡改过,就是

铁乐学python_md5校验两个文件的一致性

# 写一个函数,参数是两个文件的路径 # 返回的结果是T/F # 判断两个文件的md5值是否相同 import hashlib def diff_md5(file1,file2): def chick_md5(file): md5 = hashlib.md5() with open(file, 'rb') as f: while True: content = f.read(8192) if content: md5.update(content) else: break return md5.