1. 程式人生 > >python作業03-文件操作&函數(未完成)

python作業03-文件操作&函數(未完成)

turn remove col spa 地址 輸出 n的階乘 test dict

一、文件處理相關

1、編碼問題

  (1)請說明python2 與python3中的默認編碼是什麽?
答:Python2是ascii python3是utf-8
(2)為什麽會出現中文亂碼?你能列舉出現亂碼的情況有哪幾種?
答:中文出現亂碼都是由於文件編碼導致的。
(3)如何進行編碼轉換?
答:對文件先decode為unicode,再encode為需要轉換的編碼。
(4)#-*-coding:utf-8-*- 的作用是什麽?
答:告訴解釋器這個文件的編碼格式是utf-8
(5)解釋py2 bytes vs py3 bytes的區別
答:python3把字符串的編碼改成了unicode, 還把str和bytes做了明確區分, str就是unicode格式的字符,bytes是單純二進制。


在python2裏,bytes == str

2、文件處理
(1)r和rb的區別是什麽?
答:r是文本只讀模式
rb:二進制只讀模式,無法指定encoding,因為在該模式下數據讀到內存裏直接是bytes格式,如要查看內容還需手動decode
(2)解釋一下以下三個參數的分別作用
open(f_name,‘r‘,encoding="utf-8")
答:f_name將打開的當前目錄文件名,r:文本只讀模式,encoding="utf-8":指定打開文件為utf-8編碼模式。

二、函數基礎

1、寫函數,計算傳入數字參數的和。(動態傳參)

def func(*args):
    list1 
= [] sum_data = 0 for i in args: list1.append(i) sum_data += i print(list1) print(sum_data) func(313, 213, 12, 1234, 453, 56)

2、寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操作

def file_modify(filename, old, new):
    import os
    f = open(filename, mode=r+, encoding=utf-8
) new_f = open(filename+"_bak", mode=w, encoding=utf-8) for line in f: if old in line: line = line.replace(old,new) new_f.write(line) os.remove(filename) os.rename(filename+"_bak",filename) file_modify(aaaa.txt, ddd, goodman)

3、寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。

def func(args):
    n = 0
    for i in args:
        if i == "":
            n += 1
    print("有%s個空內容"%n)

func((1, ‘‘, 2, 44, ‘‘, 12))

4、寫函數,檢查傳入字典的每一個value的長度,如果大於2,那麽僅保留前兩個長度的內容,並將新內容返回給調用者。

  dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表

def func(args_dic):
    for i in args_dic:
        if len(args_dic[i]) > 2:
            item = args_dic[i][0:2]  # 前兩項
            args_dic[i] = item
    print(args_dic)

dic = {"k1": "v1v1", "k2": [11,22,33,44]}
func(dic)
# {‘k1‘: ‘v1‘, ‘k2‘: [11, 22]}

5、解釋閉包的概念
答:在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。

三、函數進階

1、寫函數,返回一個撲克牌列表,裏面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃A’)]

def poker():
    a = [紅心, 草花, 方片, 黑桃]
    b = [2, 3, 4, 5, 6, 7, 8, 9, 10]
    c = [J, Q, K, A]
    li = []
    for i in b:
        for j in a:
            item = (j,i)
            li.append(item)
    for m in c:
        for n in a:
            item2 = (n+m)
            li.append(item2)
    print(li)
    print(len(li))

poker()

2、寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}

def min_max(*args):  # dict形式
    li = []
    for i in args:
        li.append(i)
    li.sort()
    dic = {max:li[-1], min:li[0]}
    print(dic)

min_max(2,5,7,8,4)
# 輸出:{‘max‘: 8, ‘min‘: 2}

3、寫函數,專門計算圖形的面積
其中嵌套函數,計算圓的面積,正方形的面積和長方形的面積
調用函數area(‘圓形’,圓半徑) 返回圓的面積
調用函數area(‘正方形’,邊長) 返回正方形的面積
調用函數area(‘長方形’,長,寬) 返回長方形的面積

def area(type, *args):

    def rectangle(length, wide):
        return "長方形面積", length*wide

    def square(length):
        return "正方形面積", length**2

    def circlar(radius):
        import math
        return "圓形面積", math.pi*(radius**2)
    if type in locals():
        return eval(type)(*args)
print(area(rectangle, 133, 4))
print(area(circlar, 20))
print(area(square, 10))

4、寫函數,傳入一個參數n,返回n的階乘
例如:cal(7)
計算7*6*5*4*3*2*1

def cal(n):
    item = 1
    if int(n) == n:
        li = range(n+1)
        for i in li:
            if i == 0:
                pass
            else:
                item = item*i
        print(item)
    else:
        return "%s不是整數"%n

cal(3)

# 法二:
def cal(n):
    result=1
    for i in range(n, 0, -1): # 倒序
        result=result*i
    return result

print(cal(7))

5、編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼

user_db = {
    hqs:123,
    susiff:123,
    guangfa:123
}

with open(db.txt, w, encoding=utf-8) as f:
    f.write(str(user_db))
login_db = {user: None, status: False}
db_path = rdb.txt

def login(func):
    def inner(*args,**kwargs):
        if login_db[user] and login_db[status]:
            res = func(*args, **kwargs)
            return res
        user = input(input user:)
        passwd = input(input passwd:)
        with open(db_path, r, encoding=utf-8) as f:
            user_db2 = eval(f.read())
        if user in user_db2 and passwd == user_db2[user]:
            print(login ok)
            login_db[user] = user
            login_db[status] = True
            res = func(*args, **kwargs)
            return res
        else:
            print(login error)
    return inner  # 加括號執行,不加括號返回內存地址

@login
def home():
    print("首頁".center(40,-))

@login
def america(name):
    print("歐美專區".center(40,-))


home()
america(hqs)
四、生成器和叠代器

1、生成器和叠代器的區別?
可以被next()函數調用並不斷返回下一個值的對象稱為叠代器(Iterator).
在Python中,可以在循環過程中不斷推算後續元素,這種一邊循環一邊計算的機制,稱為生成器(generator)。
生成器是叠代器的一種:
1、生成器都是叠代器對象,但list\dict\str雖然是可叠代對象,但不是叠代器。
2、把list\dict\str等可叠代對象變成叠代器可以使用iter()函數
2、生成器有幾種方式獲取value?
next:喚醒生成器並繼續執行
send("stop"):
1.喚醒並繼續執行
2.發送一個信息到生成器內部

3、通過生成器寫一個日誌調用方法, 支持以下功能

  • 根據指令向屏幕輸出日誌
  • 根據指令向文件輸出日誌
  • 根據指令同時向文件&屏幕輸出日誌
  • 以上日誌格式如下

2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2]    user alex login success 
#註意:其中[1],[2]是指自日誌方法第幾次調用,每調用一次輸出一條日誌

python作業03-文件操作&函數(未完成)