初識函數做業

1,整理函數相關知識點,寫博客。

2,寫函數,檢查獲取傳入列表或元組對象的全部奇數位索引對應的元素,並將其做爲新列表返回給調用者。
# 本身寫的
def odd_list(lst):
    new_lst = []
    for i in range(len(lst)):
        if i % 2 == 1:
            new_lst.append(lst[i])
    return new_lst
# 老師講解的
def func(lst):
    return list(lst[1::2])


lis = ['a', 'b', 'c', 'd']
tup = (0, 1, 2, 3, 4, 5, 6)
print(odd_list(lis))
print(odd_list(tup))

3,寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大於5。
# 本身寫的
def my_len(arg):
    return True if len(arg) > 5 else False
# 老師講解的
def func(s):
    return len(s) > 5  # len(s) > 5表達式自己就是會返回bool值

s = 'abc'
lst = [1, 2, 3, 4, 5, 6]
tup = (1, 2, 3, 4)
print(my_len(s))
print(my_len(lst))
print(my_len(tup))


4,寫函數,檢查傳入列表的長度,若是大於2,將列表的前兩項內容返回給調用者。
def func(arg):
    if len(arg) > 2:
        return arg[0], arg[1]


print(func([1, 2, 3, 4]))
print(func([1, 2]))


5,寫函數,計算傳入函數的字符串中, 數字、字母、空格 以及 其餘內容的個數,並返回結果。
def func(s=""):  # 給個默認參數字符串,只是爲了下面寫代碼能給個提示,不然pycharm不知道你傳的數據類型,很差給提示
    num = 0
    alp = 0
    spa = 0
    other = 0
    for el in s:
        if el.isdigit():
            num += 1
        elif el.isalpha():
            alp += 1
        elif el == ' ':  # 這裏使用'',而不使用.isspace(),由於isspace包括空格/製表符/換行符
            spa += 1
        else:
            other += 1
    return num, alp, spa, other


print(func('123abc   # $ @567!'))



6,寫函數,接收兩個數字參數,返回比較大的那個數字。
def func(a, b):
    return a if a > b else b


print(func(1, 2))



7,寫函數,檢查傳入字典的每個value的長度,若是大於2,那麼僅保留前兩個長度的內容,並將新內容返回給調用者。
    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    PS:字典中的value只能是字符串或列表
def func(arg={}): # 給個默認參數空字典,只是爲了下面寫代碼能給個提示
    for k, v in arg.items():
        if len(v) > 2:
            arg[k] = v[:2]
    return arg


print(func({"k1": "v1v1", "k2": [11, 22, 33, 44]}))


8,寫函數,此函數只接收一個參數且此參數必須是列表數據類型,此函數完成的功能是返回給調用者一個字典,此字典的鍵值對爲此列表的索引及對應的元素。例如傳入的列表爲:[11,22,33] 
返回的字典爲 {0:11,1:22,2:33}。 def func(arg): dic = {} for i in range(len(arg)): dic[i] = arg[i] return dic print(func([11, 22, 33])) 9,寫函數,函數接收四個參數分別是:姓名,性別,年齡,學歷。用戶經過輸入這四個內容,而後將這四個內容傳入到函數中,此函數接收到這四個內容,將內容追加到一個student_msg文件中。 def func(name, sex, age, edu): with open('student_msg', mode='a', encoding='utf-8') as f: f.write(name + ' ') f.write(sex + ' ') f.write(str(age) + ' ') f.write(edu + '\n') func('梁玉鳳', '', 18, '小學') 10,對第9題升級:支持用戶持續輸入,Q或者q退出,性別默認爲男,若是遇到女學生,則把性別輸入女。 11,寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操做(升級題, 此題認真閱讀和理解. 應該有3個參數纔對)。 def func(file, old, new): import os with open(file, mode='r', encoding='utf-8') as f,\ open('file_copy', mode='w', encoding='utf-8') as f1: for line in f: line = line.replace(old, new) f1.write(line) os.remove(file) os.rename('file_copy', file) func('student_msg', '梁玉鳳', '小王') 12,寫一個函數完成三次登錄功能,再寫一個函數完成註冊功能(升級題) def login(): # 不管登陸的是不是一個用戶都只能登陸三次,輸錯三次程序退出 for i in range(3): with open('user', 'r', encoding='utf-8') as f: accounts = {} for line in f: # 將文件中的用戶名密碼添加到字典中 k, v = line.strip().split() accounts[k] = v # print(accounts) # {'alex': '123456', 'wusir': 'abcdefg'} username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() if username in accounts: # 用戶存在 if password == accounts[username]: # 判斷密碼 print(f'登陸成功,歡迎 {username}') break # 支持多用戶登陸,可是每次只能登陸一個用戶 else: if i < 2: print(f'用戶名或密碼錯誤,你還有{2-i}次登陸機會') else: print('用戶名不存在,請註冊') regist() else: # 能執行到這裏,說明沒有成功登陸.當 while/for 循環正常執行完,中間沒有被 break 停止的話,纔會執行 else 後面的語句 print('密碼錯誤三次,該帳戶沒法登陸') def regist(): username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() f = open('user', mode='a', encoding='utf-8') line = username + ' ' + password f.write('\n'+line) f.flush() f.close() print('--------------註冊完成--------------') login() # 明日默寫。 # ①,return的做用。 參考答案: 1. 遇到return.此函數結束,函數後面的東西將不會再執⾏ 2. return返回值給調用者 關於返回值: 1.不寫return,或者return後面什麼都不寫,或者return後面寫None,那麼返回的就是None 2.return後⾯寫一個值,則調⽤者能夠接收一個結果(該值) 3.return後面寫多個值, 則調⽤者能夠接收一個tuple, 調用者能夠直接解構成多個變量 # ②,傳參的幾種方法,每一個都簡單寫一個代碼。 # 如,實參,按位置傳參。 def func(x,y): pass func('a','b') # 1. 關於實參: # 1. 位置參數, 按照位置給形參傳遞信息 def func(x, y): pass func('a', 'b') # 2. 關鍵字參數, 按照形參聲明的變量名進行傳遞 def func(x,y): pass func(x='a',y='b') # 3. 混合參數. 位置(在前)+關鍵字(在後)(規定) def func(x, y): pass func('a', y='b') # 2. 關於形參(2): # 1. 位置參數, 按照位置聲明的變量 def func(x, y): pass func('a', 'b') # 2. 默認值參數 def func(x, y='b'): pass func('a') # 3. 當默認值和位置參數同時存在的時候. 規定: 默認值必須寫在後面 # 4. 動態傳參(明天) # 全部帶等號的. 都上後面去

 

import os

# 寫函數,檢查獲取傳入列表或元組對象的全部奇數位索引對應的元素, 13579
# 並將其做爲新列表返回給調用者。
def func(lst):
    return list(lst[1::2])

print(func([1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,34,45,6]))


# 3,寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大於5。
def func(s):
    return len(s) > 5

print(func("哈哈1233"))


# 4. 寫函數,檢查傳入列表的長度,若是大於2,將列表的前兩項內容返回給調用者。
def func(lst):
    if len(lst) > 2:
        return lst[0], lst[1]
        return lst[0:2]


# 5,寫函數,計算傳入函數的字符串中, 數字、字母、空格 以及 其餘內容的個數,並返回結果。
def func(s=""):
    shuzi = 0
    zimu = 0
    kongge = 0
    qita = 0
    for c in s:
        if c.isdigit():
            shuzi += 1
        elif c.isalpha():
            zimu += 1
        elif c == " ":
            kongge += 1
        else:
            qita += 1

    return shuzi, zimu, kongge, qita

print(func("jin san pang zuo tian lai zhao alex yao 5000 kuai $$$"))

# 6. 寫函數,接收兩個數字參數,返回比較大的那個數字。
def func(a, b):
    return a if a > b else b


# 7.寫函數,檢查傳入字典的每個value的長度,若是大於2,那麼僅保留前兩個長度的內容,並將新內容返回給調用者。
#     dic = {"k1": "v1v1", "k2": [11,22,33,44]}
#     PS:字典中的value只能是字符串或列表

def func(dic={}):
    for k, v in dic.items():
        if len(v) > 2:
            dic[k] = v[:2]
    return dic

print(func({"k1": "v1v1", "k2": [11,22,33,44]}))


# 8. 寫函數,此函數只接收一個參數且此參數必須是列表數據類型,
# 此函數完成的功能是返回給調用者一個字典,
# 此字典的鍵值對爲此列表的索引及對應的元素。
# 例如傳入的列表爲:[11,22,33] 返回的字典爲 {0:11,1:22,2:33}。
def func(lst):
    if type(lst) != list:
        print("回去吧. 拿個列表再過來")
        print(1/0)
        return  # 爲了調用方

    dic = {}
    for i in range(len(lst)):
        dic[i] = lst[i]
    return dic

print(func("你是誰"))


# 9. 寫函數,函數接收四個參數分別是:姓名,性別,年齡,學歷。用戶經過輸入這四個內容,
# 而後將這四個內容傳入到函數中,
# 此函數接收到這四個內容,將內容追加到一個student_msg文件中。
def func(name, gender, age, edu):
    f = open("student_msg", mode="a", encoding="utf-8")
    f.write(name+"_"+gender+"_"+age+"_"+edu+"\n")
    f.flush()
    f.close()

n = input("請輸入你的名字:")
g = input("請輸入你的性別:")
a = input("請輸入你的年齡:")
e = input("請輸入你的學歷:")
func(n, g, a, e)



# 10. 對第9題升級:支持用戶持續輸入,Q或者q退出,性別默認爲男,
#     若是遇到女學生,則把性別輸入女。
def func(name, age, edu, gender=""):
    f = open("student_msg", mode="a", encoding="utf-8")
    f.write(name+"_"+gender+"_"+age+"_"+edu+"\n")
    f.flush()
    f.close()
while 1:
    n = input("請輸入你的名字:")
    g = input("請輸入你的性別:")
    a = input("請輸入你的年齡:")
    e = input("請輸入你的學歷:")

    if g == "":
        func(n, a, e)
    else:
        func(n, a, e, g)

    content = input("信息錄入完畢, 是否繼續錄入(Q退出)")
    if content.upper() == "Q":
        break

# 寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,
# 完成整個文件的批量修改操做(升級題, 此題認真閱讀和理解. 應該有3個參數纔對)
def modify_file(file, old, new):
    with open(file, mode="r", encoding="utf-8") as f1, \
        open(file+"_副本", mode="w", encoding="utf-8") as f2:

        for line in f1:
            line = line.replace(old, new)
            f2.write(line)

    os.remove(file)
    os.rename(file+"_副本", file)


# func("student_msg", "男", "不祥之刃")
modify_file("名字", "", "")


# 12. 寫一個函數完成三次登錄功能,再寫一個函數完成註冊功能(升級題)

def regist():
    uname = input("請輸入你的用戶名:")  # wusir
    # 判斷一下用戶名是否重複:
    f = open("userinfo", mode="r", encoding="utf-8")
    for line in f: # alex_123
        un = line.split("_")[0] # 文件中的用戶名 alex
        if un == uname: # 一次判斷 沒有判斷出結果.必須等整個循環結束才能出結果
            print("對不起. 您的用戶名已經重複. ")
            return
    else:
        print("用戶名可用!")
    f.close()
    upwd = input("請輸入你的密碼:")
    f = open("userinfo", mode="a", encoding="utf-8")
    f.write(uname+"_"+upwd+"\n")
    f.flush()
    f.close()
# regist()
def login():
    count = 1
    while count <= 3:
        uname = input("請輸入你的用戶名:")
        upwd = input("請輸入你的密碼:")
        f = open("userinfo", mode="r", encoding="utf-8")
        for line in f:
            u,p = line.strip().split("_")
            if uname == u and upwd == p:
                print("登陸成功")
                return True
        else:
            print("登陸失敗, 用戶名或密碼錯誤")
            count += 1
login()
View Code
相關文章
相關標籤/搜索