Python基礎知識

Python

print()
print 參數:end 默認爲 換行,即end = "\n"
能夠不換行,即 end = ""
或指定結束,即 end = "abc"
#內建函數
"""
註釋
"""

佔位符:

  • %d 整數javascript

  • %f 浮點型 %0.1f 保留一位css

  • %s 字符串html

包裹:


import copy #引入copy包裹
import random #引入random包裹
import functools #引入functools包裹,不經常使用的函數
import time
import os     系統  os.system("cls")
import os.path
import pickle
import csv

from urllib.request import *
import re

import tkinter as tk    

os:

  • os.system() 命令行控制檯java

  • os.listdir() 顯示目錄下的內容python

  • os.mkdir() 建立文件夾git

os.path:

  • os.path.isfile() 是否爲文件編程

  • os.path.isdir() 是否爲路徑canvas

內建函數:

  1. print()api

  2. input()數組

  3. type()


    name = input("名字")
    print(name,":",type(name))

    名字123
    123 : <class 'str'>
  4. float()

  5. int()

  6. bin()

  7. hex()

  8. oct()

  9. id()查看變量的地址

  10. range(start,end,step) 建立序列 start 開始, end 結束, step 步進值

  11. ord('A') 轉化單個字母

  12. chr(97) 'a' 轉化爲字符串


  13. name='張三'
    name.encode('utf8')
    int.from_bytes(name.encode('utf8'),xxxx='big')
  14.  

變量:

  1. 變量不須要先聲明,直接賦值,直接使用

  2. 同時給多個變量賦值

  3. 命名:數字字母下劃線組成,不能以數字開頭,區分大小寫,不能使用$

  4. 不支持 自增自減 a += 1;

  5. 變量名不能夠是 關鍵字和保留字

數據類型:

1. 數字

  • 整數

    0b開頭,二進制;0o開頭,八進制;0x,十六進制;科學計數法,8e2 = 800

  • 浮點數

  • 複數:虛部以 j 或 J 結尾的爲複數

2. 字符串

  • 單引號

  • 雙引號

  • 三引號:1.多行註釋;2. 實現 多行輸出

  • 轉義字符:\


    #1.前綴 r
    print(r"\n\r\t")
    #輸出 \n\r\t
    #2.前綴 b
    #表明後面的字符串是byte數據。在python2中 print函數操做的字符串所有爲byte型數據
       #   python3中 是Unicode數據
    #3.前綴 u
    #表明後面的字符串是Unicode數據。python2爲了兼容python3
  • 【**】切片


    str1 = "山西優逸客"
    print(str1[開始下標:結束下標:步進值]
          默認 0    最後    :1
    print(str1[::-1]
  • 字符串的內建函數:
    1. String.capitalize():把字符串的第一個字符大寫
    2.String.lower():小寫
    3.String.upper():大寫
    4.擴充:
    String.center(擴充後的長度,擴充的方式) String在中間,即 在兩邊填充
    String.ljust(擴充後的長度,擴充的方式) String在左邊,即 在右邊填充
    String.rjust(擴充後的長度,擴充的方式) String在右邊,即 在左邊填充
    5.String.count("str",start,end):在start到end之間 str 的次數
    6.String.encode(encoding="utf-8",errors="ignore"):編碼 encoding="utf-8"/"gbk"/"gb2312"
    7.String.decode(encoding="utf-8",errors="ignore"[錯誤 忽略]):解碼
    8.String.endswith(」0「):是不是以 0 結尾,填寫字符串
    9.String.find(str,start,end):在start到end以前 str 的下標。沒有返回-1
    10.String.rfind(str,start,end):在start到end以前 str 的下標
    11.String.index(str,start,end):在start到end以前 str 的下標。沒有 報異常
    12.String.isalnum():至少有一個字符,全部字符爲數字或字母。爲True
    13.String.isalpha():至少有一個字符,全部字符爲字母。爲True
    14.String.isdecimal():是否字符串都是十進制數字
    15.String.isdigit():是否字符串都是數字
    16.String.islower():是否字符串都是小寫
    17.String.isupper():是否字符串都是大寫
    18.String.isspace():至少有一個字符,而且String全爲空
    19.String.join(seq):將列表對象用String轉化爲字符串

    arr = ["1","2","3","a","b"]  #必須爲字符串才能用 join
    ",".join(arr)
    #輸出結果:1,2,3,a,b
    20.String.split(",",num)

    str1 = "1,2,3,4,5,6"
    str1.split(",")   # ["1","2","3","4","5","6"]
    str1.split(",",2)   # ["1","2","3,4,5,6"]
    21.String.splitlines():將字符串經過\n進行分割
    22.String.strip(["srt"]):將字符串先後空格刪除,或者刪除str

    str2 = "   13   "
    print(len(str2))
    str3 = str2.strip()
    print(len(str3))
    str4 = str3.strip("1")
    print(len(str4))
    str1 = "1_2_3,4,5\n6"
    print(str1.splitlines())

    #輸出結果
    9
    2
    1
    ['1_2_3,4,5', '6']

3.列表

  • 列表語法:mylist=[1,2,3,4]

  • 注意:

    1. 列表能夠保存任意類型數據

      1. 列表可使用切片

      2. 列表是可變的,字符串不可變

      3. 能夠建立空列表,也能夠建立只有一個元素的列表

      4. 能夠建立多維列表

  • 列表的遍歷 for    item   in   arr:  


    for item in mylist:
       print(mylist.index(item),end=" ")
       print(item)
       
    #
    for i,v in enumerate(mylist):
       print(i)
       print(v)
     
    #enumerate(mylist):將列表轉化爲(index,item)序列
  • 深拷貝與淺拷貝


    import copy #引入copy包裹

    copy.copy(arr) #淺拷貝 裏面變化
    copy.deepcopy(arr) #深拷貝 一直不變
  • 列表內建函數


    List.append() 在最後插入一個元素
    List.insert(10,"a") 在任意位置插入元素
    List.extend([4,5,6]) 合併兩個 list 數據
    print(arr + [4,5,6] + [7,8,9]) #合併多個
    List.count(item) 查看某元素在list的次數k
    List.index(item) 查看item在list中的第一個下標。沒有 報異常
    List.pop() 刪除最後一個元素
    List.remove(item) 刪除列表中的元素,有相同的刪除第一個
    List.reverse() 將list反轉
    List.sort(reverse=True) 排序  默認爲升序   reverse=True 降序
    List.copy() 淺拷貝
    List.clear() 清空數組
  • 推倒式(python 特有的寫法 語法糖)


    arr1=['1','2','3','4']
    arr2=[item for item in arr1 if item=='3']   #  
    print(arr2)  # ['3']

4.元組

  • mytuple=(1,) 定義一個加,

  • 能夠定義空元組 不能夠改變

    mytuple=([],[]) 能夠改變 可使用數組的一些方法

  • 注意:

    • 元組元素不可改變

    • 經過圓括號定義

    • 可使用切片

    • 定義一個元素的元組,逗號不可少

    • 空元組

操做list\tuple的內建函數

  1. len(list)數組的長度

  2. max()數組的最大數

  3. min()數組的最小數

  4. list()將元組轉換爲列表

  5. tuple()將列表轉換爲元組

  6. enumerate()返回下標和元素

5.字典

  • 建立方式


    1.json格式建立
    a = {"name":"小白"}
    2.經過內建函數
    b = dict(name="小紅",age=10)
    3.經過映射函數的方式
    c = dict(zip(["name","age"],["小紅""10"])) #映射函數
    4.可迭代對象的方式
    d = dict([("name","小紅"),("age",10)])
  • 如何批量建立:


    mydict = dict.fromkeys(["name1","name2"],"小白")
    print(mydict)
    #輸出結果
    #{'name1': '小白', 'name2': '小白'}
  • 字典的訪問:mydict[鍵]

  • 刪除:del mydict[鍵]

  • mydict.clear () 清空

  • mydict.keys () 鍵名

  • mydict.values () 值

  • mydict.items () 鍵名:值

  • mydict.setdefault ("鍵名",值) 添加

  • mydict.pop() 刪除

  • mydict.popitem() 刪除最後一位的key:value

  • mydict.get("key","info") 存在key,返回key對應的value。不存在key,返回信息 info

數據類型的轉化:

  1. float() 轉化爲浮點型

  2. int() 轉化爲整型

  3. bin()將十進制轉化爲 二進制

  4. oct()將十進制轉化爲 八進制

  5. hex()將十進制轉化爲 十六進制

集合:

  • 惟一的、不可變的

  1. 建立:


    myset = set([1,2,3])
    myset = set("abc")
  2. 添加:


    myset.add("de")  #{"a","b","c","de"}
    myset.update("de")  #{"a","b","c","d","e"}
  3. 刪除:


    myset.remove("d")
  4. 列表去重


    list1 = [1,2,3,4,4,5]
    list2 = list(set(list1));
  5. 差集(-)、交集(&)、並集(|)

運算符:

  1. 算數運算符:

    • 基本算數運算符:+ - * /

      注意:Python3中,除法不管有無複雜類型,結果都精確到 浮點數
      + 操做兩個數字型數據 --- 加法
      + 操做一個數字型數據 --- 正數
      + 操做str / list / tuple --- 拼接
      - 和負數 --- 加法運算
      * 操做兩個數字型數據 --- 乘法
      *n 操做str / list / tuple --- 重複n次
    • // 除 結果爲 int

    • % 取餘

    • ** 冪運算

  2. 邏輯運算符

    • and 與

    • or 或

    • not 非

  3. 關係運算符:


    #js     動態類型 弱類型的語言(隱式轉換)
    #python 動態類型 強類型的語言(不會轉化類型)
    • == 等於

    • !=不等於

    • 「> 大於

    • < 小於

    • ">= 大於等於

    • <= 小於等於

  4. 位運算符:

    • &:按位與,兩個位 數都爲1,按位與結果爲1.不然爲0;

    • |:按位或,兩個位 數只要有一個爲1,按位或結果爲1.不然爲0;

    • ^:按位異或,兩個對應的二進位相異時,結果爲 1 。相同爲 0;

    • ~:按位取反,0爲1,1爲0;

    • << n:左移n位

    • ''>> n:右移n位

  5. 賦值運算符:

    • =

    • +=

    • -=

    • *=

    • /=

    • %=

    • //=

    • **=

  6. 成員運算符:

    • in


      arr = [1,2,3]
      print(i in arr)  #True
    • not in

  7. 身份運算符:

    • is 判斷id地址是否同樣,即 爲同一個


      num1 = 123;
      num2 = 123;
      print(num1 is num2)  #True
    • is not

運算符優先級:

冪運算、正負、算數運算符、關係運算符、賦值運算符、身份運算符、成員運算符、邏輯運算符

  • ** 指數 (最高優先級) ~ + - 按位翻轉, 一元加號和減號 (最後兩個的方法名爲 +@ 和 -@) */ % // 乘,除,取模和取整除 + - 加法減法 >> << 右移,左移運算符 & 位 'AND' ^ | 位運算符 <= < > >= 比較運算符 <> == != 等於運算符 = %= /= //= -= += *= **= 賦值運算符 is is not 身份運算符 in not in 成員運算符 not and or 邏輯運算符

分支語句:


if 1>2:
   print("1>2")
elif 2==1:
   print("2=1")
else:
   print("1<2")
   

結果1 if 表達式 else 結果2
print(1 if 1>2 else 2)  #輸出結果:2

循環語句:

  1. for


    for i in range([start,] end [,step]):
    print(i)


    for i in range(1,10):
       str1 = ""
       for j in range(1,i+1):
           if (j==2 and i==3)or(j==2 and i==4):
               str2 = " "
           else:
               str2 = " "
           str1 += str(j) + "*" + str(i) + "=" + str((i*j)) +str2
       print(str1)

    for i in range(1,10):
       for j in range(1,i+1):
           print("%d*%d=%d"%(j,i,i*j),end=" ")
       print("")
  2. while


    import random
    num = random.randint(0,100)

    s = 0
    while True:
       if s<5:
           num1 = int(input("請輸入0-100的數字:"))
           s += 1
           if num1 > num:
               print("大了一點")
           elif num1 < num:
               print("小了一點")
           else:
               print("恭喜你!")
               break

       else:
           print("你輸了!")
           break

循環終止語句:

  1. continue:

  2. break:

函數:

  1. 定義:def


    def add(a,b):
       print(a,b)    # 30,20
       return a+b

    print(add(b=20,a=30))  # 50
  • 默認參數:


def add(a=10,b):
print(a,b)    
   return a+b

print(add(b=20))  

 

  • 可變參數:*arr


def aa(*arr):
   print(arr)
aa(1,2,3,4,5)
# 輸出結果 (1,2,3,4,5)元組
  • 關鍵字參數:**attr


def person(name,age=20,**attr):
   print("name:%s"%name)
   print("age:%s"%age)
   print(attr)
 
person(name="xb",age=18,sex="男",tel=123456) #name:xb   age:18     {'sex':'男','tel':123456}
person(name="xb", sex="男", tel=123456) #name:xb   age:20     {'sex':'男','tel':123456}
person("xb", sex="男", tel=123456) #name:xb   age:20     {'sex':'男','tel':123456}
  • 參數的定義順序:必選參數、默認參數、可變參數、關鍵字參數


def person(name, age=20,*cj, **attr):
   print("name:%s" % name)
   print("age:%s" % age)
   print(cj)
   print(attr)
person("xb",68,78,84,92, sex="男", tel=123456)
#輸出結果:
name:xb
age:68
(78, 84, 92)
{'sex': '男', 'tel': 123456}

返回值:return


yield #將函數的返回內容 裝進生成器對象裏面
# 求指定數字個數的斐波那契數列
def math4(num1):
   p=0
   q=1
   c=0
   while c<num1:
       yield q
       p,q=q,p+q
       c+=1

print(list(math4(20)))

高階函數:

  1. 實參高階函數: 看成形參傳入

  2. 返回值高階函數: 返回值爲一個函數


    def add(a,b):
       return a+b
    def sub(a,b):
       return a-b
    def size(a,b,fn):
       return fn(a,b)

    print(size(10,20,add)) #實參高階函數 30
    print(size(10,20,sub)) #實參高階函數 -10

    #返回值高階函數
    def fn():
       def aa():
           print("這是一個函數")
       return aa

    bb = fn()
    bb()

空函數:pass


def fn():
   pass

匿名函數:lambda


lambda 參數 : 函數體(一行)
1.能夠有多個參數
2.不須要 return,自動return

調用:
1.自調用
print( (lambda a,b:a+b)(10,20) )    #30
2.字面量
fn = lambda a,b:a+b
print( fn(10,20) )                    #30

經常使用的使用場合:map、reduce、filter

map(函數,序列)

序列裏面的每一個都執行函數,返回 map 對象

arr = map(lambda x:x*2,range(1,11))
print(list(arr))
#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

arr = map(lambda x,y:x+y,range(1,11),range(0,10))
print(list(arr))
#[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]


arr1 = map(lambda x,y:x+y,range(1,11),range(0,5))
print(list(arr1))
#[1, 3, 5, 7, 9]

filter(函數,序列)

篩選符合 函數表達式的,返回 filter 對象

arr = filter(lambda x:x>5,range(1,11))
print(list(arr))
#[6, 7, 8, 9, 10]

reduce(函數,序列)

x指上一次執行的結果,可變的。y指每一次的序列值。返回一個值

import functools
num = functools.reduce(lambda x,y:x+y,range(1,11))

# x:0 y:1
# x:1 y:2
# x:3 y:3
# x:6 y:4

print(num)

做用域:

  • 注意:全局變量 在局部,只能訪問,不能 修改

  1. 關鍵字:global aa #aa 爲想要改變的全局變量

     至關於 聲明。不能直接 賦值 進行改變
    


  aa = 123
  def fn1():
      global aa,bb
      aa = 456
      bb = 50
     
  fn1()
  print(aa,bb)   # 456
 
  1. 改變全局變量 eg:aa
  2. 聲明全局變量 eg:bb
  1. 關鍵字:nonlocal aa


    num1 = 123
    def fn1():
    num1 = 456
    def fn2():
    nonlocal num1
    num1 += 10
    fn2()
    print(num1)

    fn1()         # 466

閉包函數:

在函數中 能夠定義另外一個函數時,若是內部函數引用了外部函數的變量,而且調用內部函數,則 產生閉包

做用:

1.在一個函數與一組私有變量之間建立關聯關係;

2.在給定函數被屢次調用的過程當中,這些私有變量保持持久性。



def aa():
   num1 = 456
   def bb():
       print(num1)     # 做用2
   return bb

b = aa()
b()     # 456           # 做用1

遞歸函數:


def f(num):
   if num==1:
       return 1
   else:
       return f(num - 1)*num

print(f(5))

裝飾器:

爲了給某程序增添功能

**理解:把須要改變的函數 看成 參數 傳入新的函數中,讓新的函數完成添加的功能。

	最後 讓 原函數名 等於 新函數 的返回值【返回值爲一個函數】


  • 三個原則:

    1. 不能修改被裝飾的函數的源代碼

    2. 不能修改被裝飾的函數調用

    3. 知足一、2的狀況下給函數添加新功能

  • 裝飾器定義公式:

    函數 + 實參高階函數 + 返回值高階函數 + 嵌套函數 + 語法糖(@tester)= 裝飾器

    import time

    # 裝飾器,添加新功能
    def tester(fn):
       def newtest():
           start = time.time()   #記錄時間的函數
           fn()                              #不修改被裝飾的函數調用
           end = time.time()
           print("總時間:",end-start)
       return newtest

    # 源程序
    def test():
       time.sleep(1)             #程序休眠 1 秒
       print("test is running")
       
    test = tester(test)    # 源程序爲「裝飾」以後的。名字能夠任意
    test()
    @函數名:把後面的 看成參數 傳入

    import time

    # 裝飾器,添加新功能
    def tester(fn):
       def newtest():
           start = time.time()   #記錄時間的函數
           fn()                              #不修改被裝飾的函數調用
           end = time.time()
           print("總時間:",end-start)
       return newtest

    @tester
    # 源程序
    def test():
       time.sleep(1)             #程序休眠 1 秒
       print("test is running")

    test()
  • 加入參數:

    按照需求往外加函數

    實質:從裏到外 調用


    import time

    裝飾器,添加新功能

    def tester1(a,b)

       def tester(fn):

           def newtest():

               start = time.time()   #記錄時間的函數

               fn()                              #不修改被裝飾的函數調用

               end = time.time()

               print("總時間:",end-start)

               print("參數:",a,b)

           return newtest

       retuen tester

    @tester1(4,5)

    源程序

    def test():

       time.sleep(1)             #程序休眠 1 秒

       print("test is running")

    至關於  test = tester1(4,5)(test)        函數的 柯里化

    test()

文件操做:

讀文件:open

open(文件路徑,打開文件模式,encoding = "utf-8",errors = "ignore")
#1.讀操做
f = open("note.txt","r")  #文件的對象
   con1 = f.read([num]) #num表明讀取字符數量,默認爲所有
   con2 = f.readline([num]) #文件讀取每一行,經過\r \n EOF(文件結束標識)。num表明讀取一行的幾個字符
   con3 = f.readlines() #返回列表形式
f.close()
print(con) # 山西太原

#2.寫操做
f = open("note.txt","w")
   f.write(str)  把str寫入文件,不會在str後加入換行符
   f.writelines(arr) 把arr寫入
打開文件模式:
r 讀操做(默認)  rb 以二進制的方式讀取
w 寫操做  每次執行重頭開始寫入,路徑不對會建立新文件 【由於 打開 指針指向開始】
a 追加   每次執行直接添加,路徑不對會建立新文件【由於 打開 指針指向結尾】
r+ 讀寫,不建立新文件,每次讀寫在文件開頭
w+ 讀寫,建立新文件,每次讀寫會覆蓋文件內容
a+ 讀寫,建立新文件,每次讀寫追加

f.seek():移動 文件讀取指針到指定位置
   f.seek(p,0)  開始,移動到文件第p個字節處,絕對位置
   f.seek(p,1)  當前位置,移動到相對於當前位置以後的p個字節(文件以二進制方式打開)
   f.seek(p,2)  結尾,移動到相對文章尾以後的p個字節(文件以二進制方式打開)
   【p爲偏移量】
   
f.tell():返回文件讀取指針位置
f.flush():把緩衝區的內容寫入硬盤
f.close():1.把緩存區的內容寫入硬盤;2.關閉文件

try:
   f = open("note2.txt","r")   #捕獲異常。
except:                         #發生異常時執行;
   print("發生錯誤")
     
   
try:
   f = open("note2.txt","r")   #捕獲異常。
finally:                        #不管發不發生異常都執行;
   if f:                       #若是f文件存在
       f.close()               #關閉文件
       
       
       
with open("note2.txt","r") as f: #用完自動關閉文件
   f.read()

pickle:默認存儲方式爲二進制

  • pickle.dump(obj,f)

  • obj = pickle.load(f)


    import pickle
    # obj = [{"name":"小白","sex":"男","age":20}]
    # with open("note.txt","wb") as f:
    #     pickle.dump(obj,f)
    with open("note.txt","rb") as f:
       obj = pickle.load(f)
       print(obj[0])

csv:存儲數據


import csv
with open("demo.csv","w"[,newline=""]) as f:
   writer = csv.writer(f,dialect="excel")
   for i in range(10):
       writer.writerow([1,2,3,4,5])
     
with open("demo.csv","w"[,newline=""]) as f:
   writer = csv.writer(f,dialect="excel")
   writer.writerows([[1,2,3,4,5],[6,7,8]])  #建立多行
   
   writer1 = csv.DictWriter(f,["id","name","sex","tel"])
   writer1.writerheader()

with open("demo.csv","r") as f:
   reader = csv.reader(f)
   print(list(reader))
#
[['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], [], ['1', '2', '3', '4', '5'], []]

with open("demo.csv","r") as f:
   reader = csv.DictReader(f)
   for item in list(reader):
       print(dict(item))
#
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}
{'1': '1', '2': '2', '3': '3', '4': '4', '5': '5'}

寫數據:


import csv
#以列表的方式寫
with open("demo.csv","w") as f:
   writer = csv.writer(f)
   writer.writerow(["id","name","sex","tel"])
   writer.writerows([
      ["1", "xb", "n", 123456],
      ["1", "xb", "n", 123456],
      ["1", "xb", "n", 123456]
  ])
   
#以字典的方式寫
with open("demo.csv","w") as f:
   writer = csv.DictWriter(f,["id","name","sex","tel"])
   writer.writeheader()
   writer.writerow({"id":"1","name":"xb","sex":"n","tel":123456})
   writer.writerows([{"id": "1", "name": "xb", "sex": "n", "tel": 123456},
                    {"id": "1", "name": "xb", "sex": "n", "tel": 123456},
                    {"id": "1", "name": "xb", "sex": "n", "tel": 123456}])

讀數據:


import csv
#以列表的方式讀
with open("demo.csv","r") as f:
   reader = csv.reader(f)
   print(list(reader))
   
#以字典的方式讀
with open("demo.csv","r") as f:
   reader = csv.DictReader(f)
   for item in list(reader):
       print(dict(item))

 

python面向對象:

類和對象:

  • class 類名:

    方法列表

  • 屬性 有:

    • 類屬性

    • 實例屬性 通常寫入 def __init__(self): 函數中

  • 方法:

    • 實例的方法

    • 靜態方法: 不能調用實例的屬性和方法,同時也不能調用類的屬性和方法,也不能調用 類的靜態方法

    • 類方法:不能調用實例的屬性和方法;能夠調用類的屬性和方法,也能夠調用 類的靜態方法

  • 實例: 實例能夠調用靜態方法和類方法!!


class Play:
   name = "xh"   #類屬性 靜態變量 靜態數據
   def __init__(self):  #能夠認爲 初始函數
       self.name = "xb" #實例屬性
       
#實例的方法
   def type(self):           #若方法中沒有用到屬性,self能夠不填
       print("1")
#實例的方法
   def nl(self):         #最好 填入 self
       print("2")
       
#靜態方法:
@staticmethod
def say():
       print("3")
       
   #類方法:
   @classmethod
   def say1(cls):
       print("4")
       
   #類方法:
   @classmethod
   def say2(cls):
       print(cls.name)
       cls.say2()
       cls.say()
       
p1 = Play()   #p1 實例

print(Car.__name__)   # 類名
print(Car.__doc__)    # 對類的描述 註釋
print(Car.__bases__)  # 全部的父類,返回 元組
print(Car.__base__)   # 父類
print(Car.__dict__)   # 返回全部的方法,以字典的形式
print(Car.__module__) # 返回類所在的模塊 __mainj__
print(Car.__class__)  # 類對應的類 <class 'type'>

特殊實例的方法:(魔法方法)


# __new__(cls)
__new__至少有一個參數cls,表明要實例化的類。

class car:
   def __new__(cls):                 # 實例化對象的過程
       return object.__new__(cls)    # 返回實例
   def __init__(self):
       self.pp = "大衆"
   def run(self):
       print("運行")

# __init__(self):   # 初始化實例

# __str__(self):   # 給實例一個描述
class car:
   def __init__(self):
       self.pp = "大衆"
   def run(self):
       print("運行")
   def __str__(self):
       return "這是一個汽車實例"
   
c = car()
print(c)   # 觸發 __str__   即 輸出 "這是一個汽車實例"
    1. 做用同上


# __repr__(self):   # 給實例一個描述
class car:
   def __init__(self):
       self.pp = "大衆"
   def run(self):
       print("運行")
   def __repr__(self):
       return "這是一個汽車實例"
   
c = car()
print(c)   # 觸發 __repr__   即 輸出 "這是一個汽車實例"

# __del__(self):   # 實例被註銷時調用
class car:
   def __init__(self):
       self.pp = "大衆"
   def run(self):
       print("運行")
   def __del__(self):
       print("這是一個汽車實例")
   
c = car()
c2 = car()
del c   # 觸發 __del__   即 輸出 "這是一個汽車實例"
del c2  # 觸發 __del__   即 輸出 "這是一個汽車實例"

 

繼承和派生:

繼承:

目的:延續舊的類的功能

  • 基類(base class)

  • 超類(super class)

  • 父類(father class)


    class B:
      name1 = "xh"
      def __init__(self):
          self.name = "xb"
      def say(self):
          print("1")
      @staticmethod
      def say1():
          print("2")
      @classmethod
      def say2(cls):
          print("3")
       
    class A(B):              #繼承 一個
         pass

     a = A()
     a.say()
     a.say1()
     a.say2()
     print(a.name)
     print(a.name1)

class B: name1 = "xh" class C: name1 = "xb" class A(B,C): #繼承 多個 pass

a = A() print(a.name1) # xh

  ```python
  class D:
      name1 = "D"
  class B(D):
      name = "B"
  class C:
      name1 = "C"
  class A(B,C):
      pass
  a = A()
  print(a.name1)        #D   就近原則,深度優先


 

派生:

目的:延續舊的類的功能並添加新的功能

  • 派生類(derived class)

  • 子類(child class)


    class B:
       name1 = "xh"
       def __init__(self):
           self.name = "xb"
       def say(self):
           print("1")
       @staticmethod
       def say1():
           print("2")
       @classmethod
       def say2(cls):
           print("3")
           
    class A(B):              #繼承
       name1 = "小紅"
    def __init__(self):
           self.name = "小白"
    a = A()
    print(a.name)           #小白
    print(a.name1)          #小紅

    class myfloat(float):
       def __new__(cls,var):
           return float.__new__(cls,round(var,3))
    num = myfloat(4.1213)
    print(num)                      #4.121
    num1 = myfloat(4.1003)
    print(num1)                      #4.1
    num2 = myfloat(4)
    print(num2)                      #4.0



    class myfloat(float):
       def __new__(cls,var):
           return float.__new__(cls,round(var,2))
       def __init__(self,con):
           self.num = con
       def get(self,type):
           return ("%0.2f%s"%(self.num,type))
    num = myfloat(4.1213)
    print(num.get("$"))
    print(num.get("¥"))

     

 

 

面向對象中經常使用的內建函數:

  • issubclass(sub,parent) 判斷sub是否爲parent的子類 返回bool

  • isinstance(ins,class) 判斷ins是否爲class的實例 返回bool

  • hasattr(obj,"attr") 判斷obj中是否有attr屬性

  • getattr(obj,"attr") 獲取obj中attr屬性

  • setattr(obj,"attr") 設置obj中attr屬性

  • delattr(obj,"attr") 刪除obj中attr屬性

  • dir() 列出類或實例的屬性和方法 以列表的形式

  • super() 尋找父類信息super(type[,object-or-type])


    class B:
       def __init__(self,val1,val2):
           self.val1 = val1
           self.val2 = val2
    class A(B):
       def __init__(self,val1,val2):
           super().__init__(val1,val2)
  • vars(object) 返回對象object的屬性 以字典的形式

私有:


class A:
   def __say(self):
       print("這是A")
   def __init__(self):
       self.__name = "aa"

a = A()
a.__say()
print(a.__name)

# 報錯
a.__say()
AttributeError: 'A' object has no attribute '__say'

class A:
   def __say(self):
       print("這是A")
   def __init__(self):
       self.__name = "aa"

a = A()
print(dir(a))
a._A__name = "bb"
print(a._A__name)

#
['_A__name', '_A__say', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
bb
繼承:

class A:
   def __say(self):
       print("這是A")
   def __init__(self):
       self.__name = "aa"
class B(A):
   pass
b = B()
print(dir(b))
b._A__name = "bb"
print(b._A__name)
b._A__say()

#
['_A__name', '_A__say', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
bb
這是A

單例模式:


class Person:  
   __instance = None
   def __new__(cls):
       if cls.__instance == None:
           cls.__instance = object.__new__(cls)
       return cls.__instance
   def __init__(self):
       pass
   def say(self):
       print(self.name)

p = Person()  
p.name = "小艾"  
p1 = Person()  
p1.say()      
             
#小艾

工廠模式:


class Dz:
   def __init__(self):
       self.type = "大衆"
   def run(self):
       print("啓動")
   def stop(self):
       print("熄火")

class BMW:
   def __init__(self):
       self.type = "寶馬"
   def run(self):
       print("啓動")
   def stop(self):
       print("熄火")
       
class Carfactory:
   def CreateCar(self,type):
       if type == "dz":
           obj = Dz()
       elif type == "BMW":
           obj = BMW()
       return obj
   
cf = Carfactory()

car1 = cf.CreateCar("dz")
print(car1.type)
car1.run()
car1.stop()

car2 = cf.CreateCar("BMW")
print(car2.type)
car2.run()
car2.stop()

封裝:

對內部數據進行保護(隱藏),或合理的暴露

異常:

即使Python程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱爲異常。

異常類:


BaseException
+-- SystemExit  解釋器請求退出
+-- KeyboardInterrupt  用戶中斷執行(ctr + c)
+-- GeneratorExit   生成器發生異常來通知退出
+-- Exception   常規錯誤基類
     +-- StopIteration 迭代器沒有更多的值
     +-- StopAsyncIteration
     +-- ArithmeticError   數值計算錯誤基類
     |    +-- FloatingPointError   浮點計算錯誤
     |    +-- OverflowError    數值運算超出最大限制
     |    +-- ZeroDivisionError    除(或取模)零 (全部數據類型)
     +-- AssertionError    斷言語句失敗
     +-- AttributeError    對象沒有這個屬性
     +-- BufferError  
     +-- EOFError  沒有內建輸入,到達EOF標記
     +-- ImportError   導入模塊失敗
     |    +-- ModuleNotFoundError
     +-- LookupError   無效數據查詢基類
     |    +-- IndexError 序列中沒有此索引(index)
     |    +-- KeyError 映射中沒有這個鍵
     +-- MemoryError   內存溢出錯誤
     +-- NameError 未聲明未初始化的本地變量
     |    +-- UnboundLocalError 訪問未初始化的本地變量
     +-- OSError   操做系統錯誤
     |    +-- BlockingIOError 操做阻塞設置爲非阻塞操做的對象(例如套接字)時引起
     |    +-- ChildProcessError 子進程上的操做失敗時引起
     |    +-- ConnectionError 鏈接相關的問題的基類
     |    |    +-- BrokenPipeError
     |    |    +-- ConnectionAbortedError
     |    |    +-- ConnectionRefusedError
     |    |    +-- ConnectionResetError
     |    +-- FileExistsError 嘗試建立已存在的文件或目錄時引起
     |    +-- FileNotFoundError    在請求文件或目錄但不存在時引起
     |    +-- InterruptedError 系統調用被輸入信號中斷時觸發
     |    +-- IsADirectoryError 在目錄上請求文件操做時引起
     |    +-- NotADirectoryError 在對非目錄的os.listdir()事物請求目錄操做(例如)時引起
     |    +-- PermissionError 嘗試在沒有足夠訪問權限的狀況下運行操做時引起 - 例如文件系統權限。
     |    +-- ProcessLookupError 當給定進程不存在時引起
     |    +-- TimeoutError 系統功能在系統級別超時時觸發。
     +-- ReferenceError    弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
     +-- RuntimeError  通常的運行時錯誤
     |    +-- NotImplementedError 還沒有實現的方法
     |    +-- RecursionError
     +-- SyntaxError 通常的解釋器系統錯誤
     |    +-- IndentationError 縮進錯誤
     |         +-- TabError    Tab 和空格混用
     +-- SystemError Python 語法錯誤
     +-- TypeError     對類型無效的操做
     +-- ValueError    傳入無效的參數
     |    +-- UnicodeError  Unicode 相關的錯誤
     |         +-- UnicodeDecodeError Unicode 解碼時的錯誤
     |         +-- UnicodeEncodeError  Unicode 編碼時錯誤
     |         +-- UnicodeTranslateError   Unicode 轉換時錯誤
     +-- Warning   警告的基類
          +-- DeprecationWarning   關於被棄用的特徵的警告
          +-- PendingDeprecationWarning    關於特性將會被廢棄的警告
          +-- RuntimeWarning   可疑的運行時行爲(runtime behavior)的警告
          +-- SyntaxWarning    可疑的語法的警告    
          +-- UserWarning  用戶代碼生成的警告
          +-- FutureWarning    關於構造未來語義會有改變的警告
          +-- ImportWarning
          +-- UnicodeWarning
          +-- BytesWarning
          +-- ResourceWarning

異常處理:


try: # 捕獲異常
   num=int(input('請輸入數字:'))
   print(num) # 沒有異常執行
except: #出現錯誤時執行
   print('輸入錯誤!')

finally:

不管是否發生異常finally都會執行


try:
   num=int(input('請輸入數字:'))
   print(num)
finally:
   print('錯誤!')

else:

沒有異常時執行


try:
   num=int(input('請輸入數字:'))
   print(num)
except:
   print('輸入錯誤!')
else:
   print('正確!')

except:

except後面能夠寫異常名稱,當出現異常的名稱與寫入的異常名稱相同時,執行語句。不寫入異常名稱時,看成通配符,處理全部異常


try:
   num=1/0
   print(num) #該異常的類爲ZeroDivisionError
except ValueError:
   print('輸入錯誤!')
   
'''
異常類不匹配,異常結果爲
Traceback (most recent call last):
File "c:/Users/JPC/Desktop/py/面向對象/deom4.py", line 2, in <module>
  num=1/0
ZeroDivisionError: division by zero
'''

異常的傳遞:


def A():
   num=1/0
   print(num)

def B():
   return A()
   
def C():
   return B()

try:
   C()
except:
   print('錯誤!')

異常拋出: raise


def input_password():

   # 1. 提示用戶輸入密碼
   pwd = input("請輸入密碼:")

   # 2. 判斷密碼長度,若是長度 >= 8,返回用戶輸入的密碼
   if len(pwd) >= 8:
       return pwd

   # 3. 密碼長度不夠,須要拋出異常
   # 1> 建立異常對象 - 使用異常的錯誤信息字符串做爲參數
   ex = Exception("密碼長度不夠")

   # 2> 拋出異常對象
   raise ex

-=
try:
   user_pwd = input_password()
   print(user_pwd)
except Exception as result:
   print("發現錯誤:%s" % result)

自定義異常:引入Exception類


class MyException(Exception):
   pass

try:
   phone_num = input("請輸入手機號:")

   if phone_num.isdecimal() is False:
       #print("手機號碼含非數字")
       raise MyException("手機號碼含非數字")
   elif len(phone_num) != 11:
       # print("手機號長度不夠")
       raise MyException("手機號長度不夠")
except MyException as error:
   print("提示:%s" % error)


結果:
請輸入手機號:sgvsdfgsgsgsdgds
提示:手機號碼含非數字
class MyException(Exception):
   pass

try:
   phone_num = input("請輸入手機號:")

   if phone_num.isdecimal() is False:
       # print("手機號碼含非數字")
       raise MyException()
   elif len(phone_num) != 11:
       # print("手機號長度不夠")
       raise MyException()
except MyException:
   print("錯誤")
   
結果:
#
請輸入手機號:asad
錯誤
#
請輸入手機號:123456
錯誤

包、模塊:

  • bao1文件夾做爲包 必須含有 __init__.py文件

1. 構建模塊的層級包

2. 控制模塊所有導出 *

3. 使用相對路徑導入包中子模塊


# 1
import a,b          引入同級的.py文件
from bao1 import a,b      引入bao1文件夾中的a.py,b.py文件
bao1文件夾做爲包 必須含有 __init__.py文件
from bao1 import a as a2  至關於給bao1中的a起名字爲a2
from bao1.a import aa2,aa3  只引入bao1中a.py文件中的 aa二、aa3方法

# 2
from bao1.a import *     引入bao1中a.py文件中的全部命名
* 默認爲全部的   也可在bao1中a.py文件中 經過 __all__=["aa3"] 指定 * 導出內容

# 3
相對路徑的方式:【.表明當前包,..表明上一級的包】
1.使用 . 的模式 不是包的目錄中 導入 會引起錯誤【.只能在包之間用】
2.from .a import aa       引入當前包中a.py文件中的 aa方法
3.使用 . 模式的文件 不能被當作主程序 運行,只能 主程序 引入該文件才能使用

4. 將模塊分割成多個文件:

 

 

5. 利用命名空間導入目錄分散的代碼:

每一個部分被組織爲 文件 目錄

 

6. 從新加載模塊:

  • import imp

  • imp.reload(模塊) 【改變模塊內容的值,主函數中也改變】

 

 

 

 

 

 

 

 

7. 運行 目錄或壓縮文件:

 

8. 讀取位於包中的數據文件:


  • 假設 mypackage :
       __init__.py
       somedata.dat
       spam.py
       
    # 若 spam.py 文件須要讀取 somedata.dat 文件內容

    #在spam.py中:

    import pkgutil
    data = pkgutil.get_data(__package__,"somedata.dat")

9. 經過字符串名導入模塊:

  • import importlib

  • aa = importlib.import_module("mypackage.aa")

  • print(aa.data)

協程,進程,線程


並行:同時可以作多少事
併發量:同一時間所可以容納任務的極限

處理併發:
進程處理:同時開始多個進程完成輪循(不多用)
線程處理:一個進程的多個線程中,完成輪循(python爲假線程 並行是假的)
協程處理:一個線程中完成輪循(耗費資源最少)

機器學習


numpy:查看矩陣

 

python GUI:

簡稱 C/S 結構,是一種網絡架構

tkinter編程:

  1. 步驟

    • 導入tkinter模塊

    • 建立頂層

  2. 窗口控件

    • 彈框:


      import tkinter as tk
      from tkinter import messagebox

      window = tk.Tk()
      window.title("個人窗口")
      window.geometry("600x400")

      def fn():
         tk.messagebox.showerror(title="error",message="代碼出現錯誤")
         # tk.messagebox.showeinfo(title="info",message="您選擇了科學型計算機")
         # tk.messagebox.showwarning(title="warning",message="這是一個警告")
         
         # b = tk.messagebox.askyesno(title="ask",message="肯定關閉嗎?") # True / False
         # b = tk.messagebox.askokcancel(title="ask",message="肯定仍是取消?") # True / False
         # b = tk.messagebox.askquestion(title="ask",message="是否關閉?") # yes / no
         # b = tk.messagebox.askretrycancel(title="ask",message="程序未響應,是否退出?")
         # # True / False
         # b = tk.messagebox.askyesnocancel(title="ask",message="是否退出?")#True/False/None
      button = tk.Button(window,text = "chick",command = fn)

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("600x400")  #設置窗口大小
  window.resizable(0,0)  #重置尺寸的範圍 (0,0)表明不能拖拽
 
  #控件:
  # 1.Labei 標籤(放文字)
  str1 = tk.StringVar()
  str1.set("hello world")
  img1 = tk.PhotoImage(file = "4a43.png")  #只能 .png 或 .gif
  #,image = img1
  l1 = tk.Label(window)  # 實例化 Label 第一個參數 爲主窗口
  l1["text"] = "hello world"   # 文本 內容
  l1["font"] = ("",20,"bold italic")
  l1["bg"] = "#ff6700"   #背景色
  l1["fg"] = "#fff"   #前景色
  l1["width"] = 20
  l1["height"] = 2
  l1["anchor"] = "c"    #文本位置   "n"北:上 "s"南:下   "w"西:左 "e"東:右 ne nw se sw c:中間
  # l1["image"] = img1
  # l1["varlable"] = str1 # 可變量 等於 一個變量,必須用tk.StringVar()定義,用set設置
 
  # 2.Button 按鈕
  num = 0
  def aa():
      # print(123)
      global num
      num += 1
      l1["text"] = "hello world"+str(num)
  b1 = tk.Button(window,text = "點擊",command = aa)
  b1["width"] = 20
  b1["height"] = 1
  b1["bg"] = "#333"
  b1["fg"] = "#fff"
 
  l1.pack()
  b1.pack()
  window.mainloop() #進行事件循環

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("600x400")  #設置窗口大小
  window.resizable(0,0)  #重置尺寸的範圍 (0,0)表明不能拖拽
 
  # 3.輸入組件:
  e = tk.Entry(window)
  e["selectbackground"] = "red"  #選中文字,的背景色
  e["selectforeground"] = "blue" #選中文字,的顏色
  # e["show"] = "*"   #呈現的樣式
 
  # 4.文本域組件
  t = tk.Text(window)
 
  def fn():
      val = e.get()    #get()獲取 e 中的值
      t.insert("end",val)   #在 t 中插入
 
  btn1 = tk.Button(window,text = "after",command = fn)
 
  def fn1():
      val = e.get()    #get()獲取 e 中的值
      t.insert("insert",val)   #在 t 中插入
 
  btn2 = tk.Button(window,text = "insert",command = fn1)
 
  e.pack()
  btn1.pack()
  btn2.pack()
  t.pack()
  window.mainloop() #進行事件循環

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("600x400")  #設置窗口大小
  window.resizable(0,0)  #重置尺寸的範圍 (0,0)表明不能拖拽
 
  l1 = tk.Label(window,text = "B",width = 20,height = 3,bg = "#333",fg = "#fff",font = ("",20))
 
  v1 = tk.Variable()
  v1.set("B")
  def fn1():
      l1["text"] = v1.get()
  # 5.單選
  r1 = tk.Radiobutton(window,text = "A",variable= v1,value = "A",command = fn1)
  r2 = tk.Radiobutton(window,text = "B",variable= v1,value = "B",command = fn1)
  r3 = tk.Radiobutton(window,text = "C",variable= v1,value = "C",command = fn1)
  r4 = tk.Radiobutton(window,text = "D",variable= v1,value = "D",command = fn1)
 
  l1.pack()
  r1.pack()
  r2.pack()
  r3.pack()
  r4.pack()
  window.mainloop() #進行事件循環

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("400x400")  #設置窗口大小
  # window.resizable(0,0) #重置尺寸的範圍 (0,0)表明不能拖拽
 
  l1=tk.Label(window,text="用戶名:",bg="#000",fg="#fff",font=("",10))
  l1.place(x=40,y=40)
 
  username,password=False,False
 
  def fn1():
      global username
      con = e.get()
      if len(con)>=10:
          # print(con)
          l3["text"] = "用戶名正確"
          l3["fg"] = "green"
          username = True
          isLogin(username,password)
          return True
      else:
          return False
  def fn2():
      l3["text"]="用戶名不正確"
      l3["fg"]="red"
 
  e = tk.Entry(window,validate="focusout",validatecommand=fn1,invalidcommand=fn2)
  # validate     focus   focusin   focusout   key
  e.place(x=100,y=40)
 
  l3=tk.Label(window,text="",font=("",10))
  l3.place(x=280,y=40)
 
  l2=tk.Label(window,text="密碼:",bg="#000",fg="#fff",font=("",10))
  l2.place(x=40,y=80)
 
 
  def fn3():
      global password
      con = e1.get()
      if len(con)>=6:
          # print(con)
          l4["text"]="密碼正確"
          l4["fg"] = "green"
          password = True
          isLogin(username,password)
          return True
      else:
          return False
  def fn4():
      l4["text"]="密碼不正確"
      l4["fg"] = "red"
      pass
  e1 = tk.Entry(window,validate="focusout",validatecommand=fn3,invalidcommand=fn4)
  e1.place(x=100,y=80)
 
  l4=tk.Label(window,text="",font=("",10))
  l4.place(x=280,y=80)
 
  def isLogin(u,p):
      if u and p:
          btn1["state"]="normal"
      else:
          btn1["state"]="disable"
  def isOK():
      u = e.get()
      p = e1.get()
      if u == "1234567890" and p == "123456":
          tk.Label(window,text="登陸成功").place(x=100,y=160)
      else:
          tk.Label(window, text="登陸失敗").place(x=100, y=160)
          btn1["state"]="disable"
          e["text"]=""
          e1["text"]=""
  btn1 = tk.Button(window,text="登陸",command=isOK)
  btn1.place(x=100,y=120)
  btn1["state"]="disable"
  btn1["activebackground"]="blue"
  btn1["activeforeground"]="#fff"
 
  btn2 = tk.Button(window,text="註冊")
  btn2.place(x=200,y=120)
  btn2["state"]="normal"
  btn2["activebackground"]="blue"
  btn2["activeforeground"]="#fff"
 
  window.mainloop() #進行事件循環

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("400x400")  #設置窗口大小
  # window.resizable(0,0) #重置尺寸的範圍 (0,0)表明不能拖拽
 
  l = tk.Label(window,width = 10,height = 1,bg = "#333",fg = "#fff")
  l.pack()
  e = tk.Entry(window)
  e.pack()
  def fn():
      arr = lx.curselection()  #選中數據的下標,返回一個元組
      con = e.get()
      if len(con) == 0:
          return
      if len(arr) == 0:
          lx.insert("end",con)
      elif len(arr) == 1:
          lx.insert(arr[0]+1,con)
      else:
          num = 1
          for i in arr:
              lx.insert(i+num,con)
              num += 1
  btn = tk.Button(window,text = "插入",command = fn)
  btn.pack()
  # 6.下拉列表
  lx = tk.Listbox(window,selectmode = "extended") #全選
  lx.insert(0,"北京")
  for item in ["上海","廣州","深圳"]:
      lx.insert("end",item)
  lx.pack()
 
  def fn1():
      print(lx.curselection())
  btn2 = tk.Button(window,text = "點擊",command = fn1)
  btn2.pack()
 
  window.mainloop() #進行事件循環

  import tkinter as tk
 
  window = tk.Tk()  #建立窗口
  window.title("個人窗口")  #設置窗口的 title
  window.geometry("400x400")  #設置窗口大小
  # window.resizable(0,0) #重置尺寸的範圍 (0,0)表明不能拖拽
 
  v1 = tk.Variable()
  v1.set(1)
  v2 = tk.Variable()
  v2.set(1)
  def fn():
      con1 = int(v1.get())
      con2 = int(v2.get())
      if con1==1 and con2!=1:
          l["text"]="我喜歡看電影"
      elif con1==0 and con2==1:
          l["text"] = "我喜歡敲代碼"
      elif con1==1 and con2==1:
          l.config(text = "都喜歡")
      else:
          l.config(text = "都不喜歡")
      print(con1,con2)
  l = tk.Label(window,width = 20,height = 3,bg = "#333",fg = "#fff",font = ("",24))
  l.pack()
  # 7.複選框
  c1 = tk.Checkbutton(window,text = "看電影",variable = v1,command=fn)
  c1.pack()
  c2 = tk.Checkbutton(window,text = "敲代碼",variable = v2,command=fn)
  c2.pack()
 
  window.mainloop() #進行事件循環

  import tkinter as tk
  from tkinter import ttk
 
  window = tk.Tk()
  window.geometry("600x300")
  window.resizable(0,0)
 
  l1 = tk.Label(window)
  l1.config({
      "text":"150.0",
      "fg":"#fff",
      "bg":"#000",
      "font":("",20,"italic bold")
 
  })
 
  l1.pack()
 
  def fn1(v):   #必須傳參數
      l1["text"] = v
  # 8.Scale 滑塊
  s1 = tk.Scale(window,command = fn1)
  s1.config({
      "orient":tk.HORIZONTAL,  # 水平方向
      "from_":50,
      "to":200,
      "length":200,
      "resolution":1,  # 步進值(默認爲 1)
      "digits":3,  # 顯示數字位數(默認 正常)
      "tickinterval":50,  # 間隔刻度(默認 沒有)最小設置爲 步進值的一半
      "showvalue": 1, # 布爾值 1(顯示上方的值) / 0(不顯示)
      "label":"溫度",  # 給滑塊添加標籤
  })
  s1.set(150) # 設置值
  print(s1.get()) # 獲取
 
  s1.pack()
 
  window.mainloop()

  import tkinter as tk
  from tkinter import ttk
 
  window = tk.Tk()
  window.geometry("600x300")
  window.resizable(0,0)
 
  def fn2():
      con = e.get()
      if int(con)>=0 and int(con)<=100:
          s1["value"] = con
          s2.set(con)
  def fn3():
      print("輸入錯誤")
  l1 = tk.Label(window,text = "0")
  l1.pack()
 
  def fn():
      con = s1.get()
      s2.set(con)
      l1["text"] = con
  # 9.數字框
  s1 = tk.Spinbox(window)
  # s1["values"] = ("北京","上海","廣州")
  # 不能設置默認值 set( )
  s1.config({
      "from_":0,
      "to":100,
      "width":10,
      "command":fn
  })
  s1.pack()
 
  def fn1(v):
      s1["value"] = v
      l1["text"] = v
      s1["value"] =""
 
  s2 = tk.Scale(window)
  s2.config({
      "orient":tk.HORIZONTAL,
      "from_":0,
      "to":100,
      "length":200,
      "command":fn1
  })
  s2.pack()
  window.mainloop()

  import tkinter as tk
  from tkinter import ttk
 
  window = tk.Tk()
  window.geometry("600x600")
  window.resizable(0,0)
 
  # 10.canvas
  canvas = tk.Canvas(window)
  canvas.config({
      "width":500,
      "height":500,
      "bg":"#ccc"
  })
  canvas.pack()
 
  # 畫圖片
  img1 = tk.PhotoImage(file = "4a43.png",width = 200,height = 100)
  cimg = canvas.create_image(100,100,image = img1)
  cline = canvas.create_line(0,0,200,200,fill = "red")
  carc = canvas.create_arc(200,200,300,300,extent = 270,start = 90,fill = "blue")
  #extent旋轉的角度 start開始的角度 fill 填充的顏色
  coval = canvas.create_oval(300,300,350,350,fill = "yellow")
  ctext = canvas.create_text(400,100,text = "Python",font = ("",20))
  cp = canvas.create_polygon(0,0,0,100,100,100,fill = "blue")
  cr = canvas.create_rectangle(400,100,500,200)
 
  def fn():
      canvas.move(coval,-20,-20)
  btn = tk.Button(window,text = "點擊",command = fn)
  btn.pack()
 
  window.mainloop()

  import tkinter as tk
  from tkinter import ttk
 
  window = tk.Tk()
  window.geometry("600x600")
  window.resizable(0,0)
 
  # 菜單欄
  # 11.Menu
 
  menu1 = tk.Menu(menubar,tearoff = 0) # 建立菜單項 tearoff = 0 / False 表示 不能移出
  menu1.add_command(label = "New Project...") # 添加內容
  menu1.add_command(label = "New...")
  menu1.add_command(label = "New Scratch File")
  menu1.add_command(label = "Open...")
  menu1.add_command(label = "Open URL...")
  menu1.add_command(label = "Save As...")
  menu1_1 = tk.Menu(menu1,tearoff = 0)
  menu1_1.add_command(label = "練習")
  menu1_1.add_command(label = "geting")
  menu1_1.add_command(label = "python例題")
  menu1_1.add_command(label = "demo1")
  menu1_1.add_command(label = "demo")
  menu1.add_cascade(label = "Open Recent",menu = menu1_1)
  menu1.add_command(label = "Close Project")
  menu1.add_command(label = "Rename Project...")
  menu1.add_separator()
 
 
  menu1_2 = tk.Menu(menu1,tearoff = 0) # 建立菜單項 tearoff = 0 / False 表示 不能移出
  img1 = tk.PhotoImage(file = "2.png",width=20,height=10)
  menu1_2.add_command(label = "設置",image = img1,compound = "left")
  menu1.add_cascade(label = "首選項",menu = menu1_2)
  menubar.add_cascade(label = "File",menu = menu1)
 
  yuyan = tk.Variable()
  yuyan.set(1)
  def fn1():
      print(yuyan.get())
  # 語言選項
  menu1_3 = tk.Menu(menu1,tearoff = False)
  menu1.add_cascade(label = "選擇語言",menu = menu1_3)
  menu1_3.add_radiobutton(label = "英語",variable = yuyan,value = 0,command = fn1)
  menu1_3.add_radiobutton(label = "漢語",variable = yuyan,value = 1,command = fn1)
  menu1_3.add_radiobutton(label = "德語",variable = yuyan,value = 2,command = fn1)
 
  s1 = tk.Variable()
  s1.set(1)
  s2 = tk.Variable()
  s2.set(0)
  s3 = tk.Variable()
  s3.set(0)
 
  def fn2():
      print(s1.get())
      print(s2.get())
      print(s3.get())
  menu1_4 = tk.Menu(menu1,tearoff = False)
  menu1.add_cascade(label = "字體",menu = menu1_4)
  menu1_4.add_checkbutton(label = "加粗",variable = s1,command = fn2)
  menu1_4.add_checkbutton(label = "傾斜",variable = s2,command = fn2)
  menu1_4.add_checkbutton(label = "下劃線",variable = s3,command = fn2)
 
  window.configure(menu = menubar) # 添加菜單欄
 
  window.mainloop()

  import tkinter as tk
  from tkinter import ttk
 
  window = tk.Tk()
  window.geometry("600x600")
  window.resizable(0,0)
 
  # menubar = tk.Menu(window,tearoff = False)
  # for item in ["css","html","javascript","python"]:
  #     menubar.add_command(label = item)
  #
  # def chilk(e):
  #     menubar.post(e.x_root,e.y_root)
  # window.bind("<Button-3>",chilk)
 
  # 12. Frame
  f1 = tk.Frame(window,width = 200,height = 200,bg = "red")
  f1.pack()
  f2 = tk.Frame(f1,width = 100,height = 100,bg = "blue")
  f2.pack()
  window.mainloop(
  1. 事件驅動處理

  2. 佈局管理器

    • pack 相對佈局:組件的大小和位置會隨着窗口的大小而改變


      l1 = tk.Label(window)  # 實例化 Label 第一個參數 爲主窗口
      l1["text"] = "hello world"   # 文本 內容
      l1["font"] = ("",20,"bold italic")  
      l1["bg"] = "#ff6700"   #背景色
      l1["fg"] = "#fff"   #前景色
      l1["width"] = 20
      l1["height"] = 2
      l1["anchor"] = "n"  #文本位置 "n"北:上 "s"南:下   "w"西:左 "e"東:右 ne nw se sw c:中間

      l1.pack()

      # 或者
      l1 = tk.Label(window,text = "hello world",font = ("",20,"bold italic"))

      #font =()元組設置字體, 「字體 用英文」,字體大小,字體樣式(加粗、傾斜)
      l1.pack()

      l1.pack(anchor = "ne")  # 錨位置 當剩餘空間遠遠大於所需空間時
      l1.pack(side = "top") # 位置(對齊方式)
      #side: 'top' / 'left' / 'right' / 'bottom'
      # tk.TOP / tk.LEFT / tk.RIGHT / tk.BOTTOM
      l1.pack(fill = tk.X)  # 位置的填充
      #fill: tk.X / tk.Y / 'x' / 'y'
      l1.pack(expand = 1) # 擴充 / 展開
      # expand: 0 (默認,不擴展) / 1(擴展,即 佔剩餘空間)
      l1.pack(padx = 10,pady = 10)
      # padx / pady : 外間距
      # ipadx / ipady : 內間距
      b2.pack_forget() # 隱藏,至關於 display:none
    • place 絕對佈局:組件的大小和位置不會隨着窗口的大小而改變


      .place(x=120,y=120)
      # x / y   # 相對於父元素 x軸偏移量 / y軸偏移量
      # relx / rely (0~1) # 參照於父元素 width,height
      # width / height
      # relwidth / relheight (0~1) # 參照於父元素 width,height
      b2.place_forget() # 隱藏,至關於 display:none
    • grid 網格佈局:經過表格形式進行佈局


      b1.grid(row = 0,column = 0,padx = 10,pady = 10)
      # row 行
      # columnspan 佔的列數
      # rowspan 佔的行數
      #sticky 相對於表格的對齊方式 n s e w 4個方位
  3. 事件的循環

    • 鼠標事件


      import tkinter as tk

      window = tk.Tk()  #建立窗口
      window.title("個人窗口")  #設置窗口的 title
      window.geometry("600x400")  #設置窗口大小

      # 鼠標事件
      window.bind("<Button-1>",lambda x:print("左擊"))
      window.bind("<Button-2>",lambda x:print("中間鍵"))
      window.bind("<Button-3>",lambda x:print("右擊"))
      window.bind("<Button-4>",lambda x:print("滾輪向上"))
      window.bind("<Button-5>",lambda x:print("滾輪向下"))

      window.bind("<Double-Button-1>",lambda x:print("左鍵雙擊"))
      window.bind("<Double-Button-2>",lambda x:print("中間鍵雙擊"))
      window.bind("<Double-Button-3>",lambda x:print("右鍵雙擊"))

      window.bind("<Triple-Button-1>",lambda x:print("左鍵三擊"))
      window.bind("<Triple-Button-2>",lambda x:print("中間鍵三擊"))
      window.bind("<Triple-Button-3>",lambda x:print("右鍵三擊"))

      window.bind("<B1-Motion>",lambda x:print("左鍵按下移動"))
      # ...
      window.bind("<ButtonRelease-1>",lambda x:print("左鍵擡起"))
      # ...
      window.bind("<Enter>",lambda x:print("鼠標移入"))
      window.bind("<Leave>",lambda x:print("鼠標移出"))

      window.mainloop() #進行事件循環
    • 鍵盤事件

相關文章
相關標籤/搜索