Trinity-SYT-SECURITY / Python-learning

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

變數

  • 標示符 => 自定義變量名稱 ,不可以數字開頭
  • 變量 => 儲存數據 => 容器
  • 變量可變 => 可重新賦值 => 每個變量都必須被賦值
  • 常量固定 => 不可被重新賦值 => 在python中沒有嚴格意義
  • 通常會將常量的標示符所有的字母全部大寫,當變量名字全部都大寫,標示符默認是一個常量,且不可修改數值。
#python無須指定變量類型
 price = 68.4 # float
 count = 2 # int 
 name = "meow" #str  '' "" "" """ """ 引號中的內容 都是字符串類型
 on_sale = True # 未知兩種結果 True / False bool
 
#通過type()查看變量類型
print(type(price))

#查看python已定義關鍵字,變數命名不可跟關鍵字重名
import keyword
print(keyword.kwlist) # 輸出關鍵字列表

['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 
'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

print(len(keyword.kwlist)) # 36

變量輸出

print("meow")
name = "ME"
age = 87
gender = 'boy'
print(name, age, gender) # Me 87 boy
print(name, age, gender,sep="") # Me87boy
print(name, age, gender,sep="*") # Me*87*boy
print(name, age, gender, sep="*", end="\n") #\n是跳行 , end="" 這樣的話不會換行輸出 

print("meow: \" I want eat some food! \"") # meow: " I want eat some food "
print('meow: \" I want eat some food! \"') #單雙引號嵌套使用  meow: " I want eat some food "

字串拼接

a = "老"
b = "王"
c = 5487
print(a+b)
print(a*5) # 老老老老老
#print(a-b) #字串之間不可用 - 進行操作

# 格式化輸出 %s %d %f 輸出一個% => %%
# 站位符
print("你好! %s %s %s" % (a,b,c)) #你好! 老 王 5487 (這裡會將int強制轉成string)

型態

number_1 = 1234 #當我們想要輸出001234時...
print("我的學號是: %06d" % number_1) # %06d 輸出的十進制整數位6位,不足的位補0
score = 59.5
print("我期末英語成績 : %f" % score) # %f表示一個符點數,默認小數後面有6位 59.500000
print("我期末英語成績 : %.2f" % score) #只想小數後留2位 59.50

# 定義一個小數scale = 0.2, 輸出: 數據比例是20.00%
scale = 0.2
print("數據比例是: %.2f%%" % (scale*100))#數據比例是: 20.00% #scale*100 要加括號 否則 會把前面的話 輸出100遍 %%表示輸出一個%

format

name = "meow"
gender = '女'
age = 18

print("姓名: %s, 性別: %s:, 年齡: %d" %  (name,gender,age))

#{}不帶編號
print("姓名: {} ,性別: {} ,年齡: {}".format(name,gender,age))

#{1}{2}有數字標號的
print("姓名: {} , 性別:{},年齡: {}, 姓名是啥來著{}".format(name,gender,age,name))
#編號以0開頭 有了數字以後,變量就可以被反覆使用
print("姓名: {0} , 性別:{1},年齡: {2}, 姓名是啥來著{0}".format(name,gender,age,name))#姓名: meow , 性別:女,年齡: 18, 姓名是啥來著meow

#用數字標號表示會出現順序上的問題
#可以使用標示名稱的方式
print("姓名: {meow} , 性別:{xingbie},年齡: {age}, 姓名是啥來著{meow}".format(meow=name,xingbie=gender,age=age)) #姓名: meow , 性別:女,年齡: 18, 姓名是啥來著meow

#定義整數變量 student_no,輸出:我的學號000004
student_no = 4
print("我的學號: %06d" % student_no)
print("我的學號: {:06d}".format(student_no)) #我的學號: 000004

#定義小數price,weight,money, 輸出 : 波羅單價9.00元/斤,購買了5.00斤,需要支付45.00元9.00
price = 9.00
weight = 5.00
money = 45.00

print("波羅單價%.2f元/斤,購買了%.2f斤,需要支付%.2f元" % (price,weight,money))
print("波羅單價{:.2f}元/斤,購買{:.2f}斤,需要支付{:.2f}元".format(price, weight, money)) #波羅單價9.00元/斤,購買5.00斤,需要支付45.00元

# 定義一個小數scale = 0.2, 輸出: 數據比例是20.00%
scale = 0.2
print("數據比例是{:.2f}%".format(scale*100)) #數據比例是20.00%

輸入

# input 默認沒有提示語句
name = input()
print(name)

#給了提示語句會被打印出來,不會自動換行
name = input("輸入名字 : ") #把鍵盤輸入的str賦值給name
print(name)

#input語句接收的內容是以字串形式存在的
#類型轉換
int(x) #將x轉換為整數
float(x) #將x轉換為符點數

項目演練

#遊戲:被鵝追
#輸入玩家名稱:
#輸入密碼:
#輸入充值帳號:
print("被鵝追")
name = input("輸入玩家名稱: ") # 輸入玩家名稱: meow
passwd = input("輸入密碼: ")

print("%s 請充值才可加入遊戲! " % name) # meow 請充值才可加入遊戲! 
coins = input("輸入充值金額: ") # 輸入充值金額: 1000
coins = int(coins)#類型轉換
print("%s充值成功! 當前儲了:%d,請開始遊戲!" %(name,coins)) #meow充值成功! 當前儲了:1000,請開始遊戲!

#遊戲:英雄聯盟
#輸入角色
#輸入擁有裝備
#輸入想購買裝備
#輸入金額
print("英雄聯盟")
role = input("輸入角色: ")
equiment = input("輸入擁有裝備: ")
print("{}當前擁有{}".format(role,equiment))
upgrade_equiment = input("輸入想購買裝備: ")
pay = input("請輸入金額: ")
equiment = upgrade_equiment

print("{}擁有{},此裝備花了{}".format(role,equiment,pay))

內存地址

n = "meow"
s = n
print(n)

#每次運行都是不一樣的內存地址,但n跟s都會一樣的地址值,指向同個內存位置
print(id(n)) #2014419339760
print(id(s)) #2014419339760


n = "meow"
s = n
print(id(n)) #s = "meow" 1923566382832

n = "nomeow"
#n在內存中另外開了一個位址
print(id(n)) #n = "nomeow" 1923566382576
print(id(s)) #s = "meow" 1923566382832

#使地址反覆使用多次
money = 10
money1 = 10
print(id(money)) #1750925470288
print(id(money1)) #1750925470288

#但交互式interpreter時會因為數值過大而內存就會另開空間
meow = 1000000
meow1 = 1000000
print(id(meow))
print(id(meow1))

#使用交互式interpreter 開闢空間的方式 分為小整數和大整數空間
#使用小整數時會使用地址的覆用(-5~257),大整數會重新開闢空間

運算符

# % ->取餘數
# // ->取商整數
#()中的運算符有最高優先權,再來是** > * > / > % > // > + > -

# 使用關係運算符的表達式最終返回一個 bool 型的結果 true False
a = 10000
b = 10000
a == b
>> true #表示a、b值相同

a is b #判斷a、b地址是否相同 is是身分運算符,用於判斷兩變量id
>> false

n1 = 8
n2 = 5 
n3 = 3
result = n1 >= (n2 + n3) and n1 > n2 #true and true => true

n2 += n3 #n2 = n2+n3 =>8
result = n1 >= n2 and n1 == n3 #true and false => false

n4 = (n1 + n3) - n2 #(8 + 3) - 8 =>3
result = n4 < n1 and (n4 + n3) > n2 #true and false => false

# if...else
a = 6
b = 5

#如果是true則將if前面的內容進行運算,並將結果賦值或成result
#如果是false則將else後面的內容進行運算,並將結果賦值或成result

result = (a + b) if a > b else (b - a)
print(result) #11

條件判斷

  flowchart  TD;
      A{要買東西?}-->|是|B[[先輸入密碼]]
      A-->|否|C[不買了沒錢了]
      B-->D{密碼對嗎?}
      D-->|對|E[進入購買頁面];
      D-->|不對|F[密碼錯誤請重新輸入!]
      F-->D
Loading
if 搜索商品:
   先輸入密碼
   if 密碼正確:
      進入購買頁面
   else: 密碼錯誤,重新輸入密碼
else: 不買了
#code 縮排為一個tab或四個空白鍵
#python規定: 判斷的變量是" "、0、 None默認是False,"meow"有值則認為是True

#登入頁面
username =  " " #默認表示False
if username != " ":
#if username: #username == False
    print("成功登入")
print("下次再來")

#小遊戲登入

print("*0"*10+"歡迎新玩家"+"*"*10)
level = input("請輸入當前級別(lv1、lv2)")
if level == "lv1":
    print("遊戲順利~")
else:
    print("請先充值")
    money = int(input("請充值: "))
    
    #再增加一個判斷:充值金額是否是50的倍數: 是:遊戲繼續 否:重新充值
    if money % 50 == 0:
        print("充值金額是{}元\n祝你遊戲愉快".format(money))
    else:
        print("重新充值,金額有誤")
       
#else: 猜數字
#產生一個隨機數
#鍵盤輸入一個數字
#將系統產生的數字和鍵盤輸入的數字做比較
#猜對了:中獎、猜錯了:掰掰下次再來

import random #亂數產生
run = random.randint(1,10) #產生1~10內的亂數
num = int(input("請輸入一個數字: "))

if num == run:
    print("猜中嘞")
else:
    print("猜錯嘞,再一次")
print("數字是{}".format(run))

#elif 多層條件判斷
考試成績評測
> 成績>=90 : A
> 90>成績>=80 : B
> 80>成績>=70 : C
> 70>成績>=60 : D
> 成績<60 :E

while True:
    score = input("輸入考試成績(1~100): ")
    test = int(score)
    if score.isdigit():
        if 0 < test <= 100:
            if test >= 90 and test >= 100:
                print("A")
                break
            elif test >= 80:
                print("B")
                break
            elif test >= 70:
                print("C")
                break
            elif test >= 60:
                print("D")
                break
            elif test < 60 and test >= 0:
                print("E")
                break
            else:
                print("請重新輸入正確數值")
                continue
        else:
            print("請輸入1~100內的分數")

if 條件 1:
    #條件1滿足執行的代碼
    if 條件 1 基礎上的條件 2:
        ...#條件 2 滿足執行的代碼
    
    else: #條件 2 不滿足的處理
        條件 2 不滿足時,執行的代碼
else: #條件 1 不滿足的處理
    條件 1 不滿足時,執行的代碼

循環語句 一般情況下,需要錯重複執行的code,都可以用循環的方式完成 (循環不是必要使用的,但是為了提高代碼的重複使用率,而使用)

for循環作為編程語言最強力的特徵之一
for循環較多用於次數可知情況下
python可以使用for語句循環遍歷整個序列的值

    關鍵字 元素 關鍵字 集合
    for   item  in    iterable:
        do something

range()函數 -> range(起始值 結束值,指定數字間隔)
該函數是python的內置函數,用於生成一系列連續的整數,大多用於for循環語句中
range(8) 起始值可以省略,默認從0開始 -->0,7 包前不包後,間隔可以省略,默認是1

#range(start, end, step= 1)
#range(start, end)
#range(end)

#range(0)是空集合

#打印三次hello

for i in range(3):  # 定義i,用於接收集合中的每一個元素,當接收一個元素時,就會執行一次
    '''
    i是一個變量 
    i = 0
    i = 1
    i = 2
    '''
    print("hello")  # 循環體


#小李超餓,要吃五個饅頭,顯示每次吃饅頭的過程,當小李吃完五個饅頭,顯示小李吃飽了

for i in range(1, 6):
    print("小李很餓,正在吃第{}個饅頭".format(i))
print("小李說:\"終於吃飽了\"")

'''
吃饅頭,在第三個饅頭上加了"砒霜"
當吃到了第三個饅頭的時候,提示:不要吃!有毒
'''
for i in range(1, 6):
    if i == 3:
        print("不要吃!有毒")
        break #結束循環,else內部語句就不會被輸出
    else:
        print("小李很餓,正在吃第{}個饅頭".format(i))
    
'''
用戶帳密登入只能登入三次,三次未成功則帳戶鎖定
輸入正確就進入後台
'''
for i in range(1, 4):
    inputlogin = input("請輸入帳號: ")
    inputpass = input("請輸入密碼: ")
    if inputpass == "admin" and inputlogin == "meow":
        print("成功登入")
        break
    else:
        print("請在輸入一次帳密")
else:
    print("帳號鎖定")
    
#pass空語句
if 10 > 7:
    print("結果正確!")

else:
   #正常來說如果這裡是空的,程序會報錯
    pass #不會做任何事情,相當於代碼的佔位,保證代碼結構的完整性,在語     法上也不會報錯
print("程序判斷成功")

#while較多用於次數未知情況下
while True: #True循環條件
    print("test")

#死循環 當循環條件一直為true,就會一直執行循環:並且沒有一個機制可以打破循環

#打印五遍meow
#1.定義重複次數計數器
i=0
#2.使用while判斷條件
while i < 5:
    #需要執行代碼
    print("meow")
    #處理計數器i
    i += 1
print("循環結束後的i = %d" % i )

# 不斷要求輸入學生姓名,輸入q結束
#以list()函數建立一個空的串列,然後透過append()方法函數把資料項目加到某一個指定的串列中。
allname = list() 
name = input("輸入名字: ")
while name != "q":
    allname.append(name)#append把指定的資料項加到串列的最後端
    name = input("輸入名字: ")
    if name == "q":
        print("程序結束")
print("您輸入的名字有:", allname)

#不斷要求用戶輸入一個數字,然後打印這個數字的兩倍,當用戶輸入q的時候程序退出

while True:
    num = input("輸入一個數字: ")
    if num == "q":
        print("程序結束")
        break
    print("您輸入的數字2倍是: %d" % (int(num)*2))

#打印1-30之間的所有3的倍數    
i = 1
while i <= 30:
    if i % 3 == 0:
        print(i)
    i += 1
    
#for 循環
for i in range(1, 31):
    if i % 3 == 0:
        print(i)
        
#水仙花數 自冪數 100-999 每個位的3次方,加起來還是他本身
# 153 = 1^3 + 5^3 + 3^3。
# 370 = 3^3 + 7^3 + 0^3。
# 371 = 3^3 + 7^3 + 1^3。
# 407 = 4^3 + 0^3 + 7^3。

#abc
#a = abc // 100
#b = (abc % 100) // 10
#c = abc % 10

i = 100
while i <= 999:
    ones = i % 10  # 個位
    tens = (i % 100) // 10  # 十位
    handreds = i // 100  # 百位

    if ones**3 + tens**3 + handreds**3 == i:
        print("水仙花數是: ", i)
    i += 1

#打印1-100的和
i = 1
result = 0  # 用來記錄算術和
while i <= 100:
    result = result + i  # 求和的累加
    i += 1

print("1-100之間的和是{}".format(result))

#不使用自符串拼接,在控制台連續輸出五行 "*",每一行 "*" 的數量一次遞增
'''
*
**
***
****
*****
'''
i = 0
while i < 5:
    i += 1
    print("*"*i)
#循環嵌套 外循環五次 內循環打印多少個 * 還要和外循環的次數相同
i = 1
while i <= 5:
    # 內循環
    j = 1
    while j <= i:
        print("*", end="")
        j += 1
    print("")  # 什麼都不打印,但要換行
    i += 1


#輸出99乘法表
i = 1
while i <= 9:
    # 內循環
    j = 1
    while j <= i:
        print("{}*{}={}".format(j, i, i * j), end="\t")
        j += 1
    print("")  # 什麼都不打印,但要換行
    i += 1

flowchart LR
   a(i=1)-->b{i<=9}
   b-->|false|c(停止運行)
   b-->|true 進入內迴圈|d(j=1)
   direction BT
   d-->e{j<=1}
   e-->|true|f(輸出i*j且j+1)
   e-->|false|g(i+1)
   g-->|回到外迴圈繼續執行|b
Loading

字串

string = "meow"
for i in string:  # string 集合
    print(i)
print(string[0])  # 字串第0位的英文
print(string.index("m"))#字串m在第幾位

s1 = 'abc'
s2 = "abc"
s3 = '''abc'''#單行字串 不用使用三對引號表示

#先比較三個字串的值
print(s1 == s2) #true
print(s2 == s3) #true
print(s1 == s3) #true
#比較id是否相同 通過自定義的字串 值相同的字串 他們id也是相同的
print(id(1))
print(id(2))
print(id(3))

str1 = input("請輸入信息: ") #輸入相同內容,比較兩個變量值和id是否相同
str2 = input("請輸入信息: ") #程序每遇到一個input輸入,都會在內存裡開一個空間
print(str1 == str2) #true
print(str1 is str2) #false
#當定義一個字串時 會在內存中開一個空間s1並指向那個空間 不過為了節約內存 會指向同個內存空間

#字串的運算符: in成員運算符
#沒連在一起的話就不是在集合中
#'ste' in name?
#'tv' in name?
name =  "steven"
result = 't' in name #返回值是bool 類型true false
print(result)#true

result = 'tv' not in name
print(result)#true

#切片
'''
         -->從左往右      從右往左<--
正索引   0  1  2  3  4  5  6  7  8  9
負索引 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
值       0  1  2  3  4  5  6  7  8  9
       起點                        終點 
'''
#語法: str[start:end:方向(+-)/間隔]
#切片使用索引值來限定範圍, 從一個大的字串中切出小的字串
#列表和元組都是有序的集合 能夠通過索引值獲取對應的數據
#字典是一個無序的集合 是使用鍵值對保存數據
#起始值:終止值 默認間隔為1


#取出字串中的文字
filename = 'picture.png'
print(filename[5])#r
#通過[]可以結合位置/(下標或索引)獲取字符,特點:只能獲取一個字母
filename = 'picture.png'
print(filename[0:5])#pictu 0是起始值 5是結束的值,但是不包括[5] 包前不包後
print(filename[3:5])#tu
print(filename[3:]) #ture.png 只要省略後面,表示取值一直取到字串的末尾 
print(filename[:7]) #picture 省略的是前面,從0開始取值,一直取到結束(不包含)

print(filename[:]) #picture.png省略了首尾,相當於取了整個字串

#集合有兩套 索引 起始或結束值出現負數的情況
print(filename[8:-1]) #pn -1是從右往左取
print(filename[:-2]) #picture.p 等價於 print(filename[:9])
print(filename[-8:]) #ture.png

#間隔 +- 1
print(filename[::]) #picture.png
print(filename[::-1])#gnp.erutcip 間隔的負號表示取值的方向

str1 = "abcdefg"
print(str[-1:-5]) #從後往前取值,但是取值的方向和間隔的方向不一致,導致不會輸出結果
print(str[-1:-5:-1]) #gfed


#大小寫切換
massage = "love meow meow"
msg = massage.capitalize()
print(msg)  # 首字大寫 Love meow meow

msg = massage.title()
print(msg)  # 每個單詞字母首位大寫 Love Meow Meow

result = msg.istitle()
print(result)  # 是否是title形式 True

msg = massage.upper()
print(msg)  # 每個字母大寫 LOVE 
msg = massage.lower()
print(msg) #全字母小寫 love meow meow

#根據系統提示輸入驗證碼,不用考慮大小寫
import random
s = 'QERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
# print(len(s))  # 61
# print(s[1])
code = ""  # 來接受隨機生成的字串
for i in range(4):
    # random(0,61) 隨機取0~61中的字串值 len是從1開始所以要減1
    ran = random.randint(0, len(s) - 1)
    code += s[ran]  # code 使用 + 進行字串拼接 + s[隨機數]

print("驗證碼是: {}".format(code))

# 提示用戶輸入驗證碼(輸入時忽略大小寫)
userinput = input("請輸入驗證碼: ")
if userinput.lower() == code.lower():  # .lower忽略大小寫
    print("驗證碼正確")

else:
    print("驗證碼有誤")

#字符串內鍵函數查找,替換
#find() rfind() lfind() #查找
#replace #替換

#find(str, beg=0 ,end=len(string)) #find(要查找字串,start,end)
#檢測str是否包含在字串中,如果指定範圍beg和end,則檢查是否包含在指定範圍內,如果包含返回開始的索引值,否則返回-1
s1 = "lucky meow meow"
position = s1.find("R")  # 返回值是-1,則表示沒找到 -1
print(position)

position = s1.find("l")  # 可以找到,返回字母第一次出現的位置 0
print(position)

p = s1.find("l", position + 1, len(s1) - 5)  # 指定位置查找,position+1,表示再次在字串中尋找第2個"l" -1
print(p)

url = "https://www.meow.com/img/bd_logo1.png"
# 獲取最右邊"/"位置
p = url.rfind('/')
print(p) #24

# 獲取最右邊"/"文件名
filename = url[p + 1:]
print(filename)#bd_logo1.png

# 擷取擴展名
p = url.rfind(".")
kz = url[p+1:]
print(kz)#png

#replace(old,new[,max])
#將字串中的str1替換成str2,如果max指定,則替換不超過max次

s1 = "meow hacker lucky"
#將s1字串空格的部分替換#
s2 = s1.replace(" ","#")
print(s2)#meow#hacker#lucky

#去除s1中的空格
s2 = s1.replace(" ","")
print(s2)#meowhackerlucky

#字串編碼和判斷開頭結尾
#encode() 編碼
#encode(encoding='UTF-8',errors='strict')
'''
以encoding指定的編碼格式編碼字串
如果出錯默認報一個ValueError的異常,除非error指定的是'ignore'或'replace'
'''
msg = "我只會meow"
result = msg.encode(encoding="UTF-8")
print(result)
#b'\xe6\x88\x91\xe5\x8f\xaa\xe6\x9c\x83meow'

#解碼decode()
m = result.decode("utf-8")
print(m)#我只會meow


#判斷開頭結尾
#startswith()
#endswith()  #返回值都是bool類型true false
#startswith  #判斷是否以xx開頭,endswith判斷是否以xxx結尾

'''
給定一個路徑,上傳文件(記事本txt或是圖片jpg.png)
如果不是對應格式的,允許重新執行上傳文件
如果符合上傳的規定則提示上傳成功
'''
while True:
    path = input("選擇文件上傳: ")
#要上傳的文件路徑 -->文件名 -->通過文件名再判斷是否是圖片類型
    p = path.rfind("\\")
    filename = path[p + 1:] #通過切片,截取出來文件名
#判斷是否是圖片類型
    if filename.endswith("jpg") or filename.endswith("png") or filename.endswith("txt"):
        print("是圖片,上傳成功")
        break
    else:
        print("不是圖片格式和記事本格式,上傳錯誤")
    
# isalpha()是否是字母
# isdigit()是否是數字
s = "abcd"
result = s.isalpha()
print("result=", result)#result= True

s = "6688"
result = s.isdigit()
print(result)#True

#判斷輸入的是否是純數字,並計算出純數字的和
sum = 0
i = 1
while i <= 3:
    num = input("請輸入數字: ")
    if num.isdigit():
        num = int(num)
        sum += num
        print("第{}個數字累加成功! ".format(i))
        i += 1
    else:
        print("不是數字")
print("sum=", sum)

#join split count 字符串作為分隔符號,將seq中所有的元素(的字符串表示)合併為一個新的字串
"""
join(seq)以指定字串作為分隔符號,將seq中所有的元素(字串表示)合併為一個新的字串
"""
#將字串abc用_連接,構成一個新的字串
new_str = "_".join("abc")
print(new_str)#a_b_c

#去除字串的空格 strip lstrip rstrip
#split() 分割字串,將切割後的字串保存到列表中

#split 分割字串,將切割後的字串保存到列表中
"""
split(str="",num=string.count(str))
num=string.count(str) 以str為分隔符截取字串,如果num有指定值,則僅截取num+1個字串
"""
#split()分割字串,將切割後的字串保存到列表中
s = "hello meow no world"
result = s.split(" ")  # 遇到空格就切一刀,最後生成一個列表
print(result) #['hello', 'meow', 'no', 'world']

result = s.split(" ", 2)  # 按照接觸空格作為分割符號,分割字串2次
print(result) #['hello', 'meow', 'no world']

#n = s.count(" ") #count(args) 求字符串中指定args的個數
#print("個數",n)

#求字串's'的個數
s = "sakkytrvbofhplkjhctdtyikjhdfgsaqhfn"
n = s.count('s')
print(n)#2

列表

  • list 用於儲存一串訊息,同時定義多個同類型的變量
  • 列表用[]定義,數據之間用 , 分隔
  • 列表的索引從0開始
  • 從列表中取值時,如果超出索引範圍,就會報錯 num_list = [1,2,3,4,5,6,7,8,9] 當寫了上面一行代碼之後,就在內存中開了個連續的10塊空間 每一塊空間都稱為這個列表的元素
#              0       1       2
name_list = ["meow","haha","hacking"]
name_list[1] #haha
name_list[2] #hacking
name_list[3] 
'''
<ipython-input-4-ce8c9d9aa7dd> in <module>
----> 1 name_list[3]

IndexError: list index out of range
'''
'''
name_list = [] #空列表
name_list.insert(索引,數據) #在指定位置插入數據
name_list.append(數據) #在末尾追加數據
name_list.extend(列表2) #將列表2的數據追加到列表
name_list[索引] = 數據 #修改指定索引的數據
name_list.remove[數據] #刪除第一個出現的指定數據
name_list.pop #刪除末尾數據
name_list.pop(索引) #刪除指定索引數據
name_list.clear #清空列表
name_list.count(數據) #數據在列表衝出現的次數
name_list.sort() #升序排列
name_list.sort(reverse=True) #降序排列
name_list.reverse() #逆序、反轉
name_list.index
'''

name_list = ["meow", "haha", "hacking"]
print(name_list[0]) #meow
print(name_list.index("haha")) #1


#修改元素
name_list = ["meow", "haha", "hacking"]
name_list[1] = "hackmeow"
print(name_list) #['meow', 'hackmeow', 'hacking']

#增加數據 append(數據)/+ 會被追加到列表的末尾
name_list = ["meow", "haha", "hacking"]
name_list.append("lucky")
name_list.append("haha")#列表允許重複元素存在
result = name_list + ["NO"]
print(name_list) #['meow', 'haha', 'hacking', 'lucky']
print(result) #['meow', 'haha', 'hacking', 'lucky', 'NO']

#insert(索引,數據)
name_list = ["meow", "haha", "hacking"]
name_list.append("lucky")
name_list.append("haha") 
name_list.insert(2, "meowmeowQAQ")
print(name_list)#['meow', 'haha', 'meowmeowQAQ', 'hacking', 'lucky', 'haha']

#extend() 擴展 + 
name_list = ["meow", "haha", "hacking"]

name_list1 = ["小紅", "小白", "小黑"]
name_list.extend(name_list1)#['meow', 'haha', 'hacking', '小紅', '小白', '小黑']
result = name_list1 + name_list
print(name_list)  # ['meow', 'haha', 'hacking', '小紅', '小白', '小黑']
print(result)

# 移除列表中元素
print(name_list)  # ['meow', 'haha', 'hacking', '小紅', '小白', '小黑']
name_list.remove("meow")
print(name_list)  # ['haha', 'hacking', '小紅', '小白', '小黑']

# pop() 默認移除列表最後一個元素,()裡面加上元素的索引,來移除這個元素
name_list.pop()
print(name_list)  # ['haha', 'hacking', '小紅', '小白']
name_list.pop(0)
print(name_list)  # ['hacking', '小紅', '小白']

#len() 用來表示集合的長度/裡面有多少個元素 length
print(len(name_list)) #3

# del + 列表[索引值]
del name_list[0]
print(name_list) #['小紅', '小白']

# clear() 清除列表
name_list.clear()
print(name_list)  # []

#count() 統計元素出現的次數
num_list = [1, 0, 2, 3, 2, 4, 7, 5, 6, 3, 1, 7, 8, 9]
num_list = num_list.count(1)
print(num_list) # 2

#sort() 升序 由小而大排列
num_list = [1, 0, 2, 3, 2, 4, 7, 5, 6, 3, 1, 7, 8, 9]
num_list.sort()
print(num_list)  # [0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9]

num_list.sort(reverse=False)
print(num_list)  # [0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9]
num_list.sort(reverse=True)
#在升序的基礎上倒序
print(num_list) # [9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 2, 1, 1, 0]

#reverse直接逆序輸出
num_list1 = [1, 6, 4, 8, 3, 2, 9, 2]
num_list1.reverse()
print(num_list1) # [2, 9, 2, 3, 8, 4, 6, 1]

循環遍歷

  • 從頭到尾一次從列表中獲取數據
  • 使用for就能實現迭代遍歷
#for 循環內部使用的變量 in 列表
name_list = ["meow", "haha", "hacking"]

for name in name_list:
    #循環內部針對使用的變量in列表
    print(name)
'''
meow
haha
hacking
'''

Tuple(元組)

  • 與列表類似,不同之處在於元組的元素不可修改
  • 表示多個元素組成的序列
  • 用於儲存一串信息,數據間使用 , 分離
  • 元組用()定義
  • 元組的索引從0開始
t1 = ()  # 定義空元組
print(type(t1))  # 查看元組類型 <class 'tuple'>

t1 = ("hello")
print(type(t1))  # <class 'str'>

#只有一個元素也要加 ,
t2 = ("hello", )  # 第一個元素的元組定義方式
print(type(t2))

t3 = ("aa", "bb")  # 多個元素的元組定義方式
t4 = (5, 6, 2, 7, 8, 3, 5, 2, 1, 0, 3, 5, 7)  # 元組的元素數據類型


#類型轉換
list_1 = []
tuple1 = tuple(list_1)#把列表轉換成元組

list_1 = list(tuple1)#把元組轉換列表

#tuple ,用小括號表示 。
#例如 (‘a’, ‘b’)。

score = ('A+',)
print(score) #('A+',)
print(type(score))  #<class 'tuple'>

#tuple屬於不可變的資料型態,不可變(Immutable)意思就是你不可以修改、增減tuple的值。也因為 tuple 不可變的特性,所以沒有append()、remove()、pop()等會更動值的操作。
#只含有一個項目時,要加上逗點當你要建立只有一個項目的 tuple,千萬要記得加上逗號,否則不會建立 tuple。
number = 1,
print(number) #(1,)




#取值 元組也是一個有序的集合
#查詢下標index來取值 切片的取值[::]
#關於元組的函數和方法
#函數: max() min() sum() len() 

#sorted() 元組能排序?
t5 = (6, 2, 3, 5, 8)
sorted(t5)
print(t5)#(6, 2, 3, 5, 8)
print(sorted(t5))#[2, 3, 5, 6, 8] 直接輸出排序操作,返回一個經過排序的
#res = sorted(t5) ==> res是一個元組元素經過排序的列表

#方法: .index() .count()

#元組數據類型轉換 ->列表轉元組
import random

list1 = []
for i in range(10):
    ran = random.randint(1, 20)
    list1.append(ran)  # 每次都在末尾追加數據
print(list1)  # [13, 18, 2, 6, 17, 20, 12, 15, 3, 14]

t5 = tuple(list1)
print(t5)  # (13, 18, 2, 6, 17, 20, 12, 15, 3, 14)

print(t5[0])  # 通過下標查看元組中元素的值 13
print(t5[-1])  # 14
print(t5[2:-3])  # (2, 6, 17, 20, 12) 通過切片取元組元素的值
print(t5[::-1])  # (14, 3, 15, 12, 20, 17, 6, 2, 18, 13) 倒序輸出
print(max(t5))  # 20
print(min(t5))  # 2

print(sum(t5))  # 求和 120
print(len(t5))  # 求元素個數 10

print(t5.count(4))  # 找出 4元素的個數 沒有不會報錯 0
print(t5.index(3))  # 找出元素中3的下標位置 沒有就報錯 8


# = 前面變量的個數和元組個數不一致的時候 可以進行拆包和裝包
#拆包與裝包-整形元素
#變量個數與元組個數不一致時
t1 = (2, 5, 7, 3, 1)
a, *_, c = t1  # 先讓固定變量接收元素, *_來接收剩下的元素,以列表的形式存在
print(a)  # 2 接收最前面的值
print(_)  # [5, 7, 3] 多值接收 去掉* 是一個裝包的過程
print(c)  # 1 接收最後值
print(*_)  # 5 7 3
print(a, _, c)  # 2 [5, 7, 3] 1
print(a, c, _)  # 2 1 [5, 7, 3]

a, c, *b = t1
print(a, b, c)  # 2 [7, 3, 1] 5

t1 = (9, )
a, *b = t1
print(a, b)#9 []
# *b表示未知個數 0~n , 0 -- [] 多個元素 -- [1,2,3,4,...]

#拆包與裝包-字串類型
x,y,*z = "hello"
print(x,y,z)#h e ['l', 'l', 'o']
print(*z)#l l o

#拆包與裝包-列表類型
x, y, *z = ['aa', 87, 'meme', 'haha', 4]
print(*z)#meme haha 4

#拆包適用於元組 字串 列表
#元組運算符: + * is in
t2 = (4, 5) + (1, 2)

t3 = (3, 4) * 2
print(t2)  # (4, 5, 1, 2)
print(t2 * 2) # (4, 5, 1, 2, 4, 5, 1, 2)

print(t3)  # (3, 4, 3, 4)

print(t2 is t3)#False兩個的地址不同
print(3 not in t3) #False

字典

  • 除列表之外python之中最靈活的數據類型
  • 可存儲多個數據
  • 列表是有序的對象集合
  • 字典是無序的對象集合
  • 字典用{}定義
dict1 = {} #定義一個空字典
dict2 = dict() #定義一個空字典
'''
字典使用鍵值對存儲數據 鍵值對之間使用 , 分隔
鍵 key 是索引
值 value 是數據
鍵 和 值之間使用 : 分隔
鍵必須是唯一
值 可以取任何數據類型,但鍵只能使用 字串 數字 或是 元組
'''

tom = {
    "name": "tom",
    "age": 18,
    "height": 1.75,
    "weight": 75}
print(tom)  # {'name': 'tom', 'age': 18, 'height': 1.75, 'weight': 75}

#將列表硬轉成字典,這個列表的每個元素都是元組,每個元組有兩個元素
#只有符合固定格式的寫法才能轉換成字典

dict4 = dict([("name", "lucy"), ("age", 18)])
# dict5 = dict([(1, 2, 3), (4, 5), (6, 7)])  # 不符合字典格式是錯誤的定義
print(dict4)  # {'name': 'lucy', 'age': 18}

dict4 = dict((["name", "lucy"], ["age", 18]))
print(dict4)  # {'name': 'lucy', 'age': 18}

tuples1 = ("name", "meow")
# dict3 = dict(tuples1) #報錯
dict4 = dict([("name", "meow")])  # 每隔元素要成對出現
print(dict4)  # {'name': 'meow'}

# 要想把列表、元組都轉換成一個字典
# dict() 內部以一個集合的形式出現,這個集合的元素要成對出現 ==> 成對 這兩個元素也要組成一個列表或元組

# dict4 = dict(((1, 2, 6), (3, 4))) #不成對出現 會報錯
dict4 = dict(((1, 2), (3, 4)))
print(dict4)#{1: 2, 3: 4}

#字典的增刪改查-增加
dict6 = {}
dict6 = {"meow": "hacking"}
print(dict6)  #{'meow': 'hacking'}

#格式: dict6[key] = value
# 特點: 按照上面的格式,如果在字典中存在同名的key,則發生值的覆蓋(後面的值覆蓋原來的值)
# KEY是唯一的 value可以是不唯一的
dict6['meow'] = 'hacker'
dict6['meow'] = "haha"

# 增加
dict6["type"] = "meowmeow book"
dict6["price"] = 1000
dict6["color"] = "black"
print(dict6) #{'meow': 'haha', 'type': 'meowmeow book', 'price': 1000, 'color': 'black'}


#用戶註冊功能,用戶填寫如下信息,完成用戶註冊
#username
#password
#email
#phone

import sys

print("*"*10+"歡迎使用meowmeow用戶註冊功能"+"*"*10)
database = []  # 定義列表用來存儲多個用戶生成的字典

while True:
    username = input("請輸入使用者名稱: ")
    password = input("請輸入密碼: ")
    repasswd = input("請再次輸入密碼: ")
    email = input("請輸入email: ")
    phone = input("請輸入手機號碼: ")

    user = {}
    # 將信息保存到字典
    user["username"] = username

    while phone.isdigit() == False or len(phone) != 9:
        print("手機號碼格式有錯(EX:123456789),請重新輸入")
        phone = input("請輸入手機號碼: ")

    while '@' not in email or '.com' not in email == False:
        print("Email格式有誤,請重新輸入")
        email = input("請輸入email: ")

    i = 0
    while i < 3:
        if password == repasswd:
            user["password"] = password
            break
        else:
            print("兩次密碼不一致!請重輸入")
            repasswd = input("請再次輸入密碼: ")
            i += 1
        if i >= 3:
            sys.exit("帳號鎖定,請等幾分鐘後重新註冊")

    user["email"] = email
    user["phone"] = phone
    # 將信息保存到資料庫
    database.append(user)

    ans = input("資料無誤,是否繼續註冊? (y/n)")
    if ans != "y":
        break

print(database)

#字典的增刪改查-查詢字典內元素
# 字典中根據KEY查找
dict1 = {"1": "老六", "2": "老李", "3": "老王"}
print(dict1)  # {'1': '老六', '2': '老李', '3': '老王'}

dict1 = {"老李": 100, "老王": 33, "老六": 83}
print(dict1["老六"])  # 取值 83

# items() #把字典轉換成列表的形式,元素是元組
print(dict1.items())  #dict_items([('老李', 100), ('老王', 33), ('老六', 83)])

# print(dict1.items())
# #dict_items([('老李', 100), ('老王', 33), ('老六', 83)])

for key, value in dict1.items():
    if value > 90:
        print(key, value)  # 老李 100


result = dict1.values()
print(result)  # dict_values([100, 33, 83])

# 求所有考生平均分
for score in dict1.values():
    print(score)  # 100 33 83
score = dict1.values()
total = sum(score)  # 216
avg = total / len(score)  # 216 / 3
print(avg)#72.0

# Keys() 取出字典中所有的鍵 生成一個列表
names = dict1.keys()
print(names)  # dict_keys(['老李', '老王', '老六'])
print(type(names))  # <class 'dict_keys'>
for name in names:
    print(name)
'''
老李
老王
老六
'''

#字典的增刪改查-刪除
#del 關鍵字
#若刪除不存在的元素會報錯

list1 = [3, 5, 6, 8]
del list1[1]
print(list1)#[3, 6, 8]

dict1 = {"老李": 100, "老王": 33, "老六": 83, "老皮": 45, "李四": 66}
del dict1["老王"]
print(dict1)#{'老李': 100, '老六': 83, '老皮': 45, '李四': 66}

#字典內置函數: 刪除
# pop(key[,default])
dict1.pop("老六")
print(dict1)#{'老李': 100, '老皮': 45, '李四': 66}
#根據KEY刪除字典中的鍵值對,返回的只要刪除成果,則返回鍵值對的值value
#pop的默認值往往實際刪除的時候沒有找到對應的key,則返回默認

#默認值 用於在找時 如果沒找到 用來提示結果
result = dict1.pop("喵喵?", "為何沒喵喵")
print(result)  # 為何沒喵喵
print(dict1)#{'老李': 100, '老皮': 45, '李四': 66}

#popitem():隨機刪除字典中鍵值對(一般是末尾刪除)

dict1 = {"老李": 100, "老王": 33, "老六": 83, "老皮": 45, "李四": 66}
result = dict1.popitem()
print(result)  # ('李四', 66)
print(dict1)  # {'老李': 100, '老王': 33, '老六': 83, '老皮': 45}

# clear() 同列表的clear
dict1.clear()
print(dict1)#{}

#update() 合併操作 相當於列表中的extend()
dict1 = {0: "tom", 1: "jack", 2: "lucy"}
dict2 = {0: "meme", "4": "meow"}
dict1.update(dict2)
print(dict1)#{0: 'meme', 1: 'jack', 2: 'lucy', '4': 'meow'}

#fromkeys(seq, [])
#將seq轉成字典的形式,如果沒有指定默認的value,則用none
list1 = ['aa', 'bb', 'cc']
newdict = dict.fromkeys(list1, 100)
newdict2 = dict.fromkeys(list1)

print(newdict)  # {'aa': 100, 'bb': 100, 'cc': 100}
print(newdict2) # {'aa': None, 'bb': None, 'cc': None}

集合 某些指定的對象集在一起就成為一個集合,其中每一個對象叫元素

格式: 集合名 = {元素1, 元素2, ...}

關鍵字 : set()

例: my_set = {1,3,5}

  • 集合是無序的 -> 不支持下標索引
  • 集合是可辨的數據類型
  • 集合中的元素是唯一的

集合一般用於元組或是列表中的元素去重複

定義一個空的集合 my_set = set()

my_set = {}這寫法是一個空字典

集合輸出結果是不會按照順序輸出,是隨機的

#定義一個集合
s1 = set() #空集合
s2 = {1,2,4,5} #有元素的集合表示方法
print(type(s1,s2)) # <class 'set'> <class 'set'>

#增加元素 .add 增加一個元素:元素的類型 可以是一個單個的元素,也可以把元組作為一個元素
s1.add('hi')
s1.add('meow')
print(s1)  #{'hi', 'meow'}

#update()可以添加多個元素 把其他集合增加進來

t1 = ('老王', '老李')
s1.update(t1)
print(s1)  #{'老李', 'hi', '老王', 'meow'}


s1.add(t1)#t1為一個元素被添加進集合
t1 = ("老王","meow","老李")
l1 = ["阿甘","丹丹"]
s1.update(t1)
s1.add(t1)  #.add可以增加一個元組 作為集合的一個元素
print(s1)  #{'老李', '老王', 'hi', 'meow', ('老王', 'meow', '老李')}

# 刪除元素 remove pop clear del
s1.remove("老王")  # 使用remove刪除一個集合裡面的元素
# s1.remove("hack")  # 刪除集合中不存在元素...會報錯
print(s1)  # {'老李', 'meow', 'hi', ('老王', 'meow', '老李')}


# pop 隨機刪除集合中元素
s1.pop()
print(s1)  # {'meow', 'hi', '老李'}

# del
# del s1 #不能刪除集合裡面的單個元素 能刪除整個集合

# discard 丟棄 能夠移除 集合中不存在的元素 也能移除不存在元素 並且不會報錯
s1.discard("meow")
print(s1)


# clear 清除所有元素
s1.clear()
print(s1)


"""
1.產生10個 1-20的隨機數 去除裡面的重複項
2.鍵盤輸入一個元素,將這個元素從不重複的集合中刪除
"""

import random

from numpy import setxor1d

list1 = []

# 產生10個隨機數,就是列表的10個元素
for i in range(10):
    ran = random.randint(1, 20)
    list1.append(ran)

# 通過集合去重
print(list1)  # [1, 12, 11, 8, 19, 15, 14, 2, 2, 4]
set1 = set(list1)
print(set1)  # {1, 2, 4, 8, 11, 12, 14, 15, 19}

# 鍵盤輸入一個元素,將這個元素從不重複的集合裡面刪除
num1 = int(input(" 輸入一個數字: "))  # 輸入一個數字: 1
set1.discard(num1)
print(set1)  # {2, 4, 8, 11, 12, 14, 15, 19}


print("*"*20+"方法2"+"*"*20)
# 方法2
set2 = set()
for i in range(10):
    ran = random.randint(1, 20)
    set2.add(ran)
print(set2)  # {2, 3, 6, 7, 10, 13, 14, 15, 17, 19}

# 鍵盤輸入一個元素,將這個元素從不重複的集合裡面刪除
num1 = int(input(" 輸入一個數字: "))  # 輸入一個數字: 3
set2.discard(num1)
print(set2)  # {2, 6, 7, 10, 13, 14, 15, 17, 19}

#其他符號 + * 
'''
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

set3 = set1 + set2
set4 = set1 * 2 集合去重,所以乘號不適用在此
print(set3)
加號與乘號不適用於集合中
'''
# - 差集 ===> .difference()
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

set3 = set1 - set2
print(set3) #{1, 2, 3}
set4 = set2 - set1
print(set4) # {8, 6, 7}
set3 = set1.difference(set2) 
print(set3) #{1, 2, 3}
set4 = set2.difference(set1) 
print(set4) # {8, 6, 7}

#{1,2,3} \ {2,3,4} = {1}
#{2,3,4} \ {1,2,3} = {4}

# in  not in成員運算符 會返回bool類型
print(6 not in set2) #False 

#交集"&"和併集"|"

# & ==> intersection() 
#共同擁有
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
set5 = set1 & set2
set6 = set1.intersection(set2)
print(set5) #{4, 5}
print(set6) #{4, 5}

# | 求兩個集合中都擁有的並去除重複
#union() 聯合
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
set6 = set1 | set2
set7 = set1.union(set2)
print(set6) #{1, 2, 3, 4, 5, 6, 7, 8}
print(set7) #{1, 2, 3, 4, 5, 6, 7, 8}

#對稱差集 包含s1 和 s2 不相同的元素 XOR ^ symmetric_difference
result = (set1|set2) - (set1&set2)
print(result) #{1, 2, 3, 6, 7, 8}

result =set1 ^ set2
print(result) #{1, 2, 3, 6, 7, 8}

result = set1.symmetric_difference(set2)
print(result) #{1, 2, 3, 6, 7, 8}

set1.symmetric_difference_update(set2) #包含_update 直接把調用者的直進行更新 成為 前面方法(symmetric_difference_update)的結果
print(set1)

可變和不可變類型 不可變類型: 對象指向內存中的值不可以改變 除了int float str tuple image

str1 = "hello"
str2 = "meow"
print(id(str1))#2249124151856
str1 = "hello_world"
str1 += str2
print(id(str1))#2249124152240

指向相同id裡面的值不可變

可變類型

list1 = [1, 2, 3, 4, 5, 6]
list2 = [4, 5, 6]
print("list1", id(list1))#list1 3094500793216

list1 += list2
print(list1)#[1, 2, 3, 4, 5, 6, 4, 5, 6]

print("list1 -->", id(list1))#list1 --> 3094500793216

dict1 = {1: "a", 2: "b"}
print(dict1)#{1: 'a', 2: 'b'}
print(id(dict1))#1876348750016

dict1[3] = "dd"
print(dict1)#{1: 'a', 2: 'b', 3: 'dd'}
print(id(dict1))#1876348750016

保證id不變的情況下在相同的空間加值且空間的值可以變化的

字符串和其他類型

#str 轉 int list tuple set // dict
str1 = "12345678"
n1 = int(str1)
print(n1)#12345678

l1 = list(str1)
print(l1)#['1', '2', '3', '4', '5', '6', '7', '8']

s1 = set(str1)
print(s1)#{'4', '3', '1', '7', '5', '6', '8', '2'}

dict1 = dict([("1", "2")])
print(dict1)#{'1': '2'}

反過來 其他類型轉字串 int float list tuple dict

list2 = [2, 3, 4, 5, 6, 7, 8]
str2 = str(list2)
print(str2)  # "[2, 3, 4, 5, 6, 7, 8]"

dict2 = {"a": "A"}
str2 = str(dict2)#'[2, 3, 4, 5, 6, 7, 8]'
print(str2)#"{'a': 'A'}"

其他容器之間的類型轉換 list 轉 set() tuple() 轉 字典[(key,value),(key,value)....(key,value)]

字典轉列表

dict3 = {1: "a", 2: "b", 3: "v"}
list3 = list(dict3)
print(list3)#[1, 2, 3] 字典轉列表 只是把字典的鍵 保存在列表中
# str() -> int() list() set() tuple()

str1 = "meow"
# 轉成列表
strlist = list(str1)
print(strlist)#['m', 'e', 'o', 'w']

# 轉成元組
strtuple = tuple(str1)
print(strtuple)#('m', 'e', 'o', 'w')

# 轉成集合 去重操作
strset = set(str1)
print(strset)#{'m', 'e', 'o', 'w'}

# 轉成整形
strint = "12567890"
strnum = int(strint)
print(strnum)#12567890

# 轉成浮點數
str2 = "3.5343"
strfloat = float(str2)
print(str2)#3.5343

函數 所謂函數,就是把具有獨立功能的代碼塊,組織為一個小模塊,在需要的時候調用函數

  • 定義函數 -> 封裝獨立的功能
  • 調用函數 -> 享受封裝的成果 函數的作用,在開發程序時,使用函數可以提高編寫的效率以及代碼的重用 image

def是英文define的縮寫 函數名稱應該都能夠表達函數封裝代碼的功能,方便後續的調用(最好是有意義的取名較容易識別區塊函數的作用)

  • 函數名稱的命名應該符合標示符的命名規則
  • 可以由字母、底線、數字組成
  • 不可以以數字做開頭
  • 不可關鍵字重名

必須先定義好函數才能調用

#test.py
# 定義函數
def multiple_table():  # 函數封裝
    i = 1
    while i <= 9:
        # 內循環
        j = 1
        while j <= i:
            print("{}*{}={}".format(j, i, i * j), end="\t")
            j += 1
        print("")  # 什麼都不打印,但要換行
        i += 1
# 定義新函數
def meow():
    print("meow")
# 若沒有調用函數,則不會輸出函數內代碼
# multiple_table()  # 調用函數

#test2.py 跨文件導入函數 需要先倒入該函數所在的檔案
import test  # 導入模塊
# 使用模塊內函數
test.multiple_table()

test.meow()

如果希望給函數添加註釋,應該在定義函數的下方,使用連續的三對引號 在連續的三對引號之間編寫對函數的說明文字 在函數調用位置,使用快捷鍵ctrl+Q可以查看函數的說明信息

image

函數參數 開發一個sum_num的函數,函數可以實現兩個數字的求和功能

def sum_num(num1, num2):  # 形參,用來接收參數
    """計算兩數和"""

    result = num1 + num2

    print("%d+%d=%d" % (num1, num2, result))
    print(id(num1))
    print(id(num2))

sum_num(100, 200)  # 實參 調用函數計算100和200 在不對函數內的程式進行更動的情況下
#把數據傳遞到函數內部
# 100+200=300
# 在傳遞參數的過程中,實際上傳遞的是實參引用(id)

print(id(sum_num(1, 2)))
# 1+2=3
# 140733332233432 地址
# sum_num(1, 2)中的num1、num2如果值改變,地址是不會變的

image

參數的作用

  • 在函數內部,把參數當作變量使用,進行需要的數據處理
  • 函數調用時,按照函數定義的參數順序,把希望在函數內部處理的數據通過參數傳遞

函數嵌套調用

  • 一個函數裡面又調用另外一個函數
def test1():
    print("#"*20)
    print("test1")
    print("#"*20)

def test2():
    print("-"*20)
    print("test2")

    test1()  # 函數嵌套調用 調用已經封裝好的程式
    print("-"*20)

test2() #程式最先從這執行 在進入test2函數後再調用test1

About