鐵樂學Python_day12_作業

来源:https://www.cnblogs.com/tielemao/archive/2018/04/04/8719180.html
-Advertisement-
Play Games

1.寫函數,返回一個撲克牌列表,裡面有52項,每一項是一個元組 例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)] 2.寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值} 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2} 3 ...


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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模板方法模式使用繼承來實現模式的功能,在基類使用一個方法來定義演算法的各個步驟,這些步驟(方法)的具體實現會放到子類中,通過這樣來實現不同演算法對象的演算法拼合,完成該對象整體演算法的實現。 作用 模板方法中定義了具體操作中所使用演算法的各個步驟,並將其實現交由子類完成,從而實現多種不同的功能; 類視圖 實現 ...
  • 一、前言 BIM:Building Information Modeling 建築信息模型,就是將建築的相關信息附著於模型中,以管理該建築在設計、算量、施工、運維全生命周期的情況。創建模型的主要主流軟體有Autodesk(歐特克)的Revit、Bentley的microstation、達索的CATI ...
  • 策略模式將不同演算法的邏輯抽象介面封裝到一個類中,通過組合和多態結合的方式來進行不同演算法具體的實現。 作用 策略模式是一種定義一系列演算法的方法,Strategy類層次為Context定義了一系列的可重用的演算法或行為, 所有的演算法以相同的方式進行調用,減少了演算法類之間的耦合 類視圖 實現 Strateg ...
  • 面向對象這門課,寫了3次作業,在這裡分享一下自己的設計思路、分析總結等,歡迎一起探討~ ...
  • 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 一. 下載並安裝Nginx 去Nginx官網下載 我這裡選取nginx/Windows-1.10.3版本,下載後解壓出來即可,解壓出來的路徑不能含有中文 我解壓後將其放置的路徑如下 二、開始運行 在當前目錄下按住shift+滑鼠右鍵,選擇“在此處 ...
  • 這篇文章主要介紹了python sort、sorted高級排序技巧,本文講解了基礎排序、升序和降序、排序的穩定性和複雜排序、cmp函數排序法等內容,需要的朋友可以參考下 Python list內置sort()方法用來排序,也可以用python內置的全局sorted()方法來對可迭代的序列排序生成新的 ...
  • ...
  • 目前知道的迭代器有兩種: 一種是調用方法直接返回的; 一種是可迭代對象通過執行iter方法得到的。 迭代器的好處是可以節省記憶體。 如果在某些情況下,我們也需要節省記憶體,就只能自己寫。自己寫的這個能實現迭代器功能的東西就叫生成器。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...