1. 程式人生 > >python字典與函式

python字典與函式

字典

一、定義

  d=dict(a=2,b='hello')   ##直接定義賦值
  d={}.fromkeys()  ##採用fromkeys函式定義
列印模組pprint,使輸出更美觀
# import pprint  ##匯入pprint模組
# user=[]
# for i in range(10):  ##生成user列表user1-user10使用者
#     user.append('user%d' %(i+1))
# pprint.pprint({}.fromkeys(user,'123456'))  ##一鍵賦值所有key:123456

二、字典的操作

1.檢視key值對應的value值
  print(d['b'])  ##value值存在時,輸出;不存在時,報錯
  print(d['f'])

  print(d.get('b'))  ##value值存在時,輸出;不存在時,輸出None
  print(d.get('f'))
2.指定輸出字典的key、value、key-value
  print(d.keys())    ##列印字典中所有的key值
  print(d.values())  ##列印字典中所有的value值
  print(d.items())   ##列印字典中所有的key-value值對
3.修改字典元素
# d['a']=100  ##key存在時,修改對應的value值;不存在時,新增
# d['f']=11  

# d2=dict(a=110,x=0)  ##key存在時,覆蓋原value值;不存在時,新增
# print(d.update(d2))

# d.setdefault('a',100)  ##key存在時,不做操作;不存在時,新增
# d.setdefault('x',100)
4.遍歷字典
# for key,value in d.items():
#     print(key,value)
5.刪除字典元素
# del d['a'
] ##key值存在則刪除;不存在則報錯 # del d['f'] # value=d.pop('a') ##key值存在則刪除,返回對應的value值;不存在則報錯 # value=d.pop('f') pair=d.popitem() ##隨機刪除,一般是最後一個,返回值為key-value值對 print(d,pair)
6.實現switch,case功能
注意:python不支援switch,case功能,需要用其他方法實現
num1 = int(input('please input a num:'))
choice = input('please make your choice:')
num2 = int(input('please input a num:'))
dict = {       ##實現兩個int數字加減乘除的效果
    '+': num1 + num2,
    '-': num1 - num2,
    '*': num1 * num2,
    '/': num1 / num2,
}
print(dict.get(choice, 'error'))   ##get()函式預設為None
7.列表去重的第二種方法
a=[1,3,4,3,6,1]
print({}.fromkeys(a).keys())  ##拿出字典的key值
##將列表生成字典,相同key值會自動覆蓋,value值預設為none

三、練習

1.生成172.25.254.1~172.25.254.200隨即IP,並統計次數
import pprint  ##pprint模組,輸出更美觀
import random  ##random模組,生成隨機數

d = {}   ##定義空字典
for num in range(200):   ##生成200個隨機數
    ip= '172.25.254.' + str(random.randint(1,200))  ##將int型轉換成str型
    if ip in d:   ##判斷ip是否存在
        d[ip] += 1  ##若存在,則對應的value值加1
    else:
        d[ip] = 1   ##若不存在,則賦值1
pprint.pprint(d)  ##pprint列印結果
2.生成1~200的隨機數,升序排列並統計次數
import pprint
import random
###與練習1不同的是,需要定義隨機數列表並排序
d = {}  ##定義數字儲存的字典
l = []  ##定義隨機數的列表
for num in range(200):   ##生成200個隨機數字
    l.append(random.randint(1,200))
l.sort()  ##對數字列表進行升序排列
for N in l:
    if N in d:
        d[N] += 1
    else:
        d[N ]= 1
pprint.pprint(d) 
2.使用者登陸優化:
import pprint
##優化的目的:管理系統可以新建、登陸、刪除、檢視使用者資訊等
userdict = {
    'root': 'westos',
    'kiosk': 'redhat'
}
menu = """
        Users Operation
    1).New user
    2).User login
    3).Delete user
    4).View users
    5).exit  
Please input your choice:"""
while 1:  ##採用死迴圈的格式
    choice = input(menu)
    if choice == '1':
        print('New User'.center(30, '*'))
        name = input('please input a username:')
        if name in userdict:  ##判斷使用者是否存在
            print(name + ' is already exist!')
        else:    ##使用者不存在,則在使用者字典中新增使用者資訊
            passwd = input('please set your passwd:')
            userdict[name] = passwd
            print(name + ' is ok!')
    elif choice == '2':
        print('User Login'.center(30, '*'))
        for i in range(3):  ##限制使用者3次登陸機會
            USER = input("please input username:")
            if USER in userdict:  ##判斷登陸使用者是否存在
                PASS = input("please input passwd:")
                if PASS == userdict[USER]:  ##判斷使用者密碼
                    print("Login successfully")
                    break
                else:
                    print("Login failly")
            else:
                print(USER + " is not exist")
                continue
        else:
            print("ERROR:Time is over")
    elif choice == '3':
        print('Del User'.center(30, '*'))
        name = input('please input a username:')
        if name in userdict:  ##刪除前,先判斷使用者是否存在
            del userdict[name]  ##此處可增加限制,密碼匹配方可刪除
            print(name + ' is already deleted!')
        else:
            print(name + ' is not exist!!')
    elif choice == '4':
        print('View User'.center(30, '*'))
        pprint.pprint(userdict)  ##pprint列印使用者資訊
    elif choice == '5':
        print('Exit'.center(30, '*'))
        break
    else:
        print('ERROR!!!')

函式

一、定義函式

1.函式引數:形參
def test(形參):  ##函式名,形參可任意
    pass    ##函式體
    return  ##返回值,預設為none
2.有返回值,可選引數:return關鍵字
def test(*arges):   ##可選引數,表示引數個數不限
    return sum(arges)  ##sum(),求和函式

print(test(1,2))  ##呼叫函式,不會輸出返回值
print(test(1,2,3))  ##只有列印函式執行結果時,會輸出返回值
3.沒有返回值
def test(*arges):
    print(sum(arges))   ##函式體:列印arges的和

test(1,2)     ##執行函式就會有結果(跟函式寫法有關)
test(1,2,3)
test(1,2,3,4,5)
4.預設引數
# def test(num,x=2):  ##'=':表示預設引數
#     print(num**x)   ##實現:求平方效果
#
# test(2,4)  ##呼叫函式時有引數,則按引數執行
5.關鍵字引數
# def test(name,age,**kwargs):   ##'**kwargs':表示關鍵字引數
#     print(name,age,kwargs)
#
# test('lee',20,weight=50,tall=174)  ##關鍵字引數,以字典格式儲存
6.引數組合

定義引數的順序必須是:
必選引數、 預設引數、可選引數和關鍵字引數

7.return關鍵字

注意:當函式執行過程遇到return時,後面的程式碼不再執行

8.全域性變數 global

區域性變數: 函式中的變數,只在函式中生效
global: 使區域性變數變成全域性變數

二、練習

1.f(n)為完全平方和公式,給定k,a,b,求a,b之間有多少個n滿足k*f(n)=n
a= int(input('a:'))   ##輸入範圍a,b
b = int(input('b:'))
k = int(input('k:'))  ##指定k值
count = 0    ##計數

def f(n):    ##計算完全平方和
    res = 0
    for i in str(n):  ##強制轉換成字串,遍歷
        res += int(i) ** 2  ##求完全平方和結果
    return res

def isok(num):  ##該函式判斷是否滿足條件
    if k * f(num) == num:  ##符合題目條件,則返回true,否則False
        return True
    else:
        return False

for num in range(a, b + 1):  ##在a、b之間嘗試
    if isok(num):  ##滿足條件,計數+1
        count += 1
print(count)
2.一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
def main(num):  ##定義函式
    for x in range(1000):  ##遍歷1000內的整數
        if x ** 2 == num:  ##當num是完全平方數時,返回True
            return True

for i in range(1000):   ##遍歷1000內的整數
    n1 = i + 100   ##題目要求+100和+168後依然是完全平方數
    n2 = i + 168
    if main(n1) and main(n2):  ##呼叫函式,當n1和n2均成立,i滿足要求
        print(i)
3.使用者管理系統——終極版

要求:使用者新建時,“*“ 提示使用者名稱和密碼必須有,年齡和聯絡方式可不填

import pprint   ##匯入pprint模組,使輸出更美觀

userdict = {      ##使用者資訊字典
    'root': 'westos',
    'kiosk': 'redhat'
}
menu = """    
        Users Operation
    1).New user
    2).User login
    3).Delete user
    4).View users
    5).exit

Please input your choice:"""  ##輸入提示

def log(name, password, **kwargs):   ##log()函式,關鍵字引數
    userdict[name] = (password, kwargs) 
 ##在userdict中新增元素key=name,value=(password, kwargs)

while 1:   ##死迴圈
    choice = input(menu)    ##輸入操作選項
    if choice == '1':
        print('New User'.center(30, '*'))   ##新建使用者
        name = input('please input your *username:')
        if name in userdict:  ##判斷使用者是否存在
            print(name + ' is already exist!')
        else:   ##使用者需輸入密碼、年齡(可選)、郵箱(可選)
            passwd = input('please set your *passwd:')
            age = input('please input your age:')
            mail = input('please input your mail:')
            log(name, passwd, Age=age, Mial=mail)  ##呼叫函式,新增新使用者資訊
            print(name + ' is ok!')   ##返回使用者新增成功
    elif choice == '2':
        print('User Login'.center(30, '*'))   ##登陸介面
        for i in range(3):  ##3次登陸機會
            USER = input("please input username:")
            if USER in userdict:   ##判斷使用者是否存在
                PASS = input("please input passwd:")
                if PASS == userdict[USER]:    ##判斷密碼是否存在
                    print("Login successfully")
                    break
                else:
                    print("Login failly")
            else:
                print(USER + " is not exist")
                continue  ##跳出本次迴圈,繼續執行
        else:
            print("ERROR:Time is over")
    elif choice == '3':    ##刪除使用者
        print('Del User'.center(30, '*'))
        name = input('please input a username:')
        if name in userdict:
            del userdict[name]   ##根據key值刪除userdict中資訊
            print(name + ' is already deleted!')
        else:
            print(name + ' is not exist!!')
    elif choice == '4':   ##檢視使用者資訊
        print('View User'.center(30, '*'))
        pprint.pprint(userdict)   ##可遍歷輸出
    elif choice == '5':
        print('Exit'.center(30, '*'))
        break
    else:
        print('ERROR!!!')
4.給定整數,執行函式Collatz,若該整數為偶數,列印並返回num//2,若為奇數,列印並返回3*num+1
def Collatz(num):   ##定義函式Collatz()
    if num % 2 == 0:    ##判斷num是否為偶數
        print(num // 2)  ##取整
        return num // 2
    else:
        print(3 * num + 1)   ##為奇數時,重新賦值
        return 3 * num + 1

n = int(input('please input an int:'))  ##強制轉換為int型
while 1:
    n = Collatz(n)  ##呼叫函式
    if n == 1:  ##當n為1時滿足要求,退出
        break