1. 程式人生 > 其它 >8/16

8/16

今日考題
1.for迴圈語法結構及適用場景,range三種用法

1.for I in range :  #所有容器類都可放range的位置
用來迴圈取值

2.列舉python常見資料型別及儘可能多的內建方法

整型
bin()  # 轉二進位制
oct()  # 轉八進位制
hex()  # 轉十六進位制
int()  轉十進位制

浮點型
float(11) # 11.0 沒啥好用的

字串
len()  # 記長度(字元個數)
[0,10,2]  # 從第一個元素取到第10個步長為2(數兩個拿一個)
.strip # 去掉指定字元前面加l或者r可以去掉左邊右邊
.split('|',maxsplit=3)  # 按|分割 ,最多分3次
.upper # 全大寫 加is字首判斷是否全大寫
.lower  # 全小寫 加is字首判斷是否全小寫
.isdigit  # 判斷是否全數字
.count # 數出現次數
.replace('a','b',3)  # 把a換成b 換3個
'|'jion(l) # 用|把l裡面元素連起來
用加號也能實現

列表
.len
[]
.append # 在末尾加一個元素
insert(0,'a')  # 在第一個位置加個
.pop # 從原列表彈出元素,會返還一個值
.extend # 擴充套件列表
.sort # 升序排列
.sort(reverse=True)  # 降序排列

字典
.len
.get # 沒有的元素返回none
d['name']='leo'  # 有這個K:V鍵值對就改變值  沒有就新增這對
.pop
.keys  # 取K
.values  # 取V
.items  # 都要

集合
&  # 交集
|  #並集
-  # 某集合去掉和另一個集合的交集
^  # 並集去掉交集
>  # 父集
<  # 子集

上週五內容回顧

  • 作業講解和拔高
  # 1.先寫註釋
  """
  2.再寫主體功能
  3.最後再補全額外的操作
  """
再脫稿完成一次完整的猜年齡遊戲
  • 猜年齡遊戲脫稿獨立優化完整版
# 6.加一個引數去控制猜的次數
hp = 3
# 1.猜數字麼必然有一個迴圈要一直猜,別多想先while
while True:
    # 7.先判斷有沒有資格猜
    if hp > 0:  # 有資格猜執行下面的子程式碼
        # 2.迴圈裡面第一步是每次猜的值
        age = input('請猜我的年齡>>>')
        # 3.有了輸入年齡就要判斷比較,但是輸入的是字串要轉整型,就要做第一步判斷
        if age.isdigit() == True:
            age = int(age)  # 4.轉換完之後就可以進行數字的比較了
            if age > 22:
                print('猜大了')
                hp -= 1  # 8.猜錯扣血
            elif age < 22:
                print('猜小了')
                hp -= 1
            else:
                print('恭喜猜對了')
                break  # 5.比較出結果就停止迴圈了,那要加限定次數就得再加個引數
        else:
            print('年齡只能是純數字')
    else:
        answer = input('輸入con繼續猜三次 輸入任意退出>>>')
        # 判斷是否要繼續
        if answer == 'con':
            print('您還能再猜三次')
            hp += 3  # 加上血
        else:
            print('謝謝參與')
            break

效果還是不錯的雖然很簡單的程式但是看到自己的進步

  • 流程控制for迴圈
for迴圈能做的while都能做
但是for迴圈簡單方便很多

for 變數名 in 可迭代物件
	迴圈體程式碼
    
range 方法
	顧頭不顧尾
      預設從0開始
        最後一個引數表示等差數列
        
  • 資料型別內建方法
"""
句點符(.)  快速檢視當前物件的屬性和方法
"""
整型int
	int()  
    	1.型別轉換
        2.其他進位制數轉十進位制數
浮點型float
	float()
字串str
	索引取值
    切片操作
    間隔步長
    統計長度
    strip()
    split()
    upper()
    lower()
    isupper()
    islower()
    join()
    isdigit()
    ...
列表list
	索引取值
    切片操作
    間隔步長
    統計長度
    append()
    insert()
    extend()
    pop()
    remove()
    sort()
    ...
元組tuple
	索引取值
    切片操作
    間隔步長
    統計長度
字典dict
	按key取值
    統計長度
    d[key] = value
    ...
集合set
	去重與關係運算
布林值bool
	對與錯

今日內容概要

  • 作業分析
  • 字元編碼
理論居多  結論很少  學習簡單
  • 檔案操作
程式碼操作檔案
  • 登入註冊功能
稍微有點難度

今日內容詳細

作業分析

l = [1, 22, 33, 22, 11, 22, 66, 55, 77, 99]
# 對列表元素進行去重
# 拔高: 去重之後保持原來的順序(不要慣性思維)
l = [11, 22, 33, 22, 11, 22, 66, 55, 77, 99]
# 1.將列表轉換成集合
s1 = set(l)
# 2.由於集合內部不允許出現重複的元素 會自動去重
l1 = list(s1)
print(l1)
"""集合內元素是無序的"""
# 1.先定義一個空列表
new_list = []
# 2.迴圈獲取列表中每一個元素
for num in l:
    # 3.判斷當前元素在不在新的列表內
    if num not in new_list:
        # 4.如果元素不在列表內 說明該元素是第一次出現 應該新增到列表中
        new_list.append(num)
    # else:
    # 5.如果元素已經存在 說明該元素重複了 應該取出
print(new_list)
# 3.關係運算
# 有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合
pythons = {'jason', 'egon', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'kermit', 'tony', 'gangdan'}
# 1. 求出即報名python又報名linux課程的學員名字集合
print(pythons & linuxs)
# 2. 求出所有報名的學生名字集合
print(pythons | linuxs)
# 3. 求出只報名python課程的學員名字
print(pythons - linuxs)
# 4. 求出沒有同時這兩門課程的學員名字集合
print(pythons ^ linuxs)

這個作業之前我就已經完成的不錯了


我的成果

'''
第一題
'''
l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
# 1首先要把值先迴圈取出
d = {'k1': [], 'k2': []}
for i in l:
    # 2然後判斷大小
    if i > 60:  # 3大於的放到字典K裡那就要去前面做個字典
        # 4把元素加到字典後面的列表裡  注意是加到後面的列表
        d['k1'].append(i)
    else:
        # 5與第四步同理
        d['k2'].append(i)
print(d)
'''
第二題
'''
l = [11, 22, 33, 22, 11, 22, 66, 55, 77, 99]
# 對列表元素進行去重
#        拔高:去重之後保持原來的順序
l1 = []  # 1.因為要的結果是個新列表所以先去前面做個新的空列表
# 2.要保持原來順序所以沒法用集合肯定是要用for的
for i in l:
    # 3.要去重就把加個判斷l1裡面有沒有
    if i not in l1:
        # 把l1裡沒有的元素加進去,有的不加就不會有重合的了
        l1.append(i)
print(l1)
'''
第三題
=
'''
pythons = {'jason', 'egon', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'kermit', 'tony', 'gangdan'}
# 就是交集
print(pythons & linuxs)
# 並集 關鍵字|
print(pythons | linuxs)
# 就是python 裡面去掉linuxs裡重複的用-很好理解
print(pythons - linuxs)
# 沒同時報的就取交集的反(雖然直接取反沒做出來)  不過可以用並集去掉交集
print((pythons | linuxs) - (pythons & linuxs))
print(pythons ^ linuxs)

字元編碼

'''
計算機基於電工作只有高低電頻兩種狀態
也就是說計算機只認識兩種狀態 人為的酒吧這兩種狀態定義為0和1
	人類的字元與數字之間存在對應關係
		相當於發電報彼此攜帶的密碼本一樣
'''
1.一家獨大
	計算機是美國人發明的 想讓計算機認識英文
        ASCII碼
            內部記錄了英文與數字的對應關係
   	
2.群雄割據
	中國人
    	GBK碼
        	內部記錄了英文 中文與數字的對應關係
    韓國人
    	Euc_kr碼
        	內部記錄了英文 韓文與數字的對應關係
    日本人
    	shift_JIS碼
        	內部記錄了英文 日文與數字的對應關係

3.天下一統
	unicode碼(萬國碼)
    	內部記錄了各個國家文字與數字的對應關係
    utf8(萬國碼優化版本)
    	目前預設使用該編碼
   

  # 以後文字檔案出現亂碼就直接改字元編碼

編碼和解碼

# 編碼
	按照指定的編碼本將人類的字元程式設計成計算機能夠識別的二進位制資料
# 解碼
	按照指定的編碼本將計算機的二進位制資料解析成人類能夠讀懂的字元
 '關鍵是用程式碼怎麼實現'

res ='試試python怎麼編碼解碼'
print(res.encode('gbk'))  # 編碼了  關鍵字.encode  
r1 = res.encode('gbk')
print(r1.decode('gbk'))  # 解碼了  關鍵字.decode

檔案操作

with open(檔案路徑,讀寫模式,字元編碼) as 變數名:
    前面的with的子程式碼

    
# 第二種(不推薦使用)
變數名 = open(檔案路徑,讀寫模式,字元編碼) 
一系列操作
變數名.colse()

讀寫模式

r 只讀模式
	1.檔案路徑不存在會直接報錯
    2.檔案存在則開啟,可讀取檔案內容
    	游標在檔案開頭
 with open(r'a.txt', 'r', encoding='utf8') as f:
            print(f.read())  # 一次性讀取檔案內容
w 只寫模式
	1.檔案路徑不存在會自動建立
    2.檔案路徑存在會先清空該檔案內容然後再寫入
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('小桌板\t小茶几\t靠背墊\n')
a 只追加模式
	1.檔案路徑不存在會自動建立
    2.檔案路徑存在游標會移動到檔案末尾
with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('你愛我呀\t我愛你\t米雪冰城\n甜蜜蜜')

    
# 補充知識  讀取優化
之前介紹了.read是一次性全部讀取如果檔案超級大記憶體有爆的風險
就優化出了這個操作
 with open(r'a.txt', 'r', encoding='utf8') as f:
        for line in f:  # 一行行的讀取檔案內容記憶體就不會爆了

操作模式

t模式
	文字模式(也是上述三種讀寫模式的預設模式)
    rt
    wt
    at
1.該模式下只能操作文字檔案
2.該模式下必須指定encoding引數
3.讀寫都是以字串為單位





b模式
	二進位制模式
    	rb
        with open(input(r'請輸入複製檔案的絕對路徑>>>'), 'rb') as f:
        wb
        ab
  1.該模式可以操作任意型別的檔案
  2.該模式下不需要指定encoding引數
  3.讀寫都是以bytes(二進位制)為單位

用b模式可以完成一些簡單的操作比如複製

還可以用b模式完成t模式一樣的文字編寫

作業

1.完成今日部落格
2.利用檔案操作編寫一個簡易的檔案拷貝系統
	讓使用者輸入需要拷貝的檔案路徑
    然後再獲取即將拷貝到哪兒的路徑
       # 先讓使用者輸入要複製的檔案絕對路徑
with open(input(r'請輸入複製檔案的絕對路徑>>>'), 'rb') as f:
    copy_add = input(r'請輸入想要複製到的絕對路徑>>>')
    # 獲取輸出位置要在for迴圈外面不然一直輸地址
    for line in f:  # 一行一行的去讀寫的資料
        with open(copy_add, 'ab') as g:  # 因為是一行行寫入的那就只能用ab了
            g.write(line)
3.利用檔案操作完成使用者的註冊 登入
	userinfo.txt
	基本要求
    	使用者註冊獲取使用者名稱和密碼然後寫入檔案  jason|123 
        登入獲取使用者名稱和密碼之後去檔案中比對
        # 上述操作完成一次就算成功
    拔高練習
    	使用者註冊可以多次註冊並且校驗使用者名稱是否重複
        登入需要逐行比對