1. 程式人生 > 實用技巧 >Python筆記

Python筆記

一、資料型別

1.基礎

0漁:( **kwargs) 傳:1. name = ...
                     2. 字典 **{,,,,}
( *args)  可變長度的列表(元祖)
( **kwargs) 可變長度的字典
*[] 遍歷元素

print 預設換行,如需取消,可更改為 print('aaa',end = '\t')

enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標

變數:
    1.變數只是一個門牌號,無任何實際意義
    2.同樣的值不會被建立多次,再有變數則直接指向它

一、基本資料型別:
    python 函式中 start、end:均為 [ ) ,從0開始

1.字串 str :(11個魔法)

    #字串一經建立不可修改,所有修改和拼接都產生新的字串(在記憶體中連續)
	1. 加法:組合
	2. 乘法:重複n次
	3. input() 接收到的都是字串
	4. int() 可將字串強制轉換成數字
	5. str() 可將某資料型別強制轉換成字串    -- 只在外面加了 ''
	6. in 和 not in 成員運算子
    ################### 7個基本魔法 ##################
	join replace split(不保留分割) find strip(去除) upper lower
	-- 首字母大寫  .capitalize()
	-- 變小寫  casefold   lower
	-- 變大寫  upper
	-- 大小寫 翻轉 swapcase
	-- 在某長度居中 center
	-- 放左邊 ljust
	-- 放右邊 rjust
	-- 去除 (前面後面)所有空格、\n、\t(或指定字元,放括號裡傳進去)  strip、lstrip、rstrip
	-- 子字串 在原字串中有幾個 count
	-- 判斷開頭、結尾 startswith endswith
	-- 索引子字串位置  index find
	-- 格式化 format  將字串中佔位符{xx} 賦值  ,, 用法還挺多(模板輸出必用!方便!)
	    -- 賦值法
	        -- test = '可愛的{name}最喜歡在{location}幹{hobby}'
	        -- test.format(name = name, location = location,hobby = hobby)
	    -- 順序法
	        -- test = '可愛的{}最喜歡在{}幹{}'
	        -- .format(name,location,hobby)
	-- 判斷是否全是 字母/漢字 、數字 isalnum
	-- 判斷是否全是 字母/漢字 isalpha
	-- 判斷是否全是 數字      isdigit   isdecimal 還一個
	-- 判斷是否存在 特殊\n \t 字元  isprintable
	-- 判斷是否全是空格 isspace
	-- 製表  expandtabs()  將製表符 展開為n個空格
	    -- 最後加,巨他媽方便! 將 \t 填充為 你想要的多少個空格
 ★ -- join- 將..拼接符 插入字串之間 (產生新的,需要用新變數儲存,原來字串的統統不變)  join
	-- 字元替換 之 replace
	    -- test.replace('aa','11',2)
	        # 將'aa'替換為'11',只替換前2個,預設為替換全部
	        # 一次只能替換1種

	-- 字元替換 之 translate
	    --先建立翻譯法則 m = str.maketrans('aeiou','12345')
	    --再按照法則翻譯 v = test.translate(m)
	-- 字串分割
	    -- 普通分割
	          partition('s') 按第一個's'分割成3份    ('s'保留)
	         rpartition('s') 按倒數第一個's'分割成3份('s'保留)
	          split('s',8)  從左往右找8個's'進行分割('s'不保留)(不傳個數時,預設分割所有's')
	          -- 超級方便的接受方法:v1,v2,..., = test.split('f')
	         rsplit('s',8)  從右往左找8個's'進行分割('s'不保留)
	    -- 按行分割
	        splitlines(True/False用於選擇是否保留換行,釘在前面)

    ##################### 5個灰魔法 ######################

    -- 索引
        [3]    第4個元素
    -- 切片   [ )(左閉右開) 結果仍為字串而非元素--字元
        [0:3]   第1-3 個
        [0:-1]  第1-最後(-1不包括)
        [2: ]  第3個 - 最後全部
    -- 獲取長度
         len(test)  或   .len()
        (字串長度 / 元素個數)
    -- for迴圈
        for A in test :
            print(A)
    -- range
        用於建立連續的數字,或固定步長的數字
        range(100)  : 0,1,2,...,99
        range(1,100) : 1,2,3,...,99
        range(0,100,5) :  0,5,10,..,95
        range(100,0,-1) :  從後往前

2.數字 int :
	1. 次方:**
	2. 取餘:% (可用於判斷奇偶數)
	3. 取商://
	4. 加法求和時用 sum1 , 防止覆蓋掉sum()函式功能

	################## 數字的 方法 #################

	1. bit_length()     獲取數字佔了幾位

3.布林值 bool :
    1.True False
        -- True : '有東西' 、 數字不為0
        -- False : '   '  、  0

    2.開頭必須大寫

4.列表 list :
-- li = [ 1,2,'a','b', [1,'a'] ,2 ]
    1.元素也可為列表,子列表整體為一個元素
    2.可用 [ :] 切片 ,得到的結果仍為列表
        取最後一個:[-1]
    3.支援 for迴圈、while迴圈 : 遍歷每個'元素'
    4.支援 in 操作,查詢元素
    4.修改:列表可被修改(記憶體中可不連續地存)
        -- 不可修改: 數字,字串,元祖
        -- 可修改:  列表,字典,陣列,集合
    5.刪除:del
    6.強制轉換:list('asdf')
        -- ['a','s','d','f']
    7.列表->字串:
        1.列表元素都是字串:
            -- ''.join(li)
        2.列表元素有數字:
            -- 寫for迴圈,v = v + str(s)

    ############### list類:方法 (list可修改,不可用新變數接收)#################
 ★ 1. li.append('ss')
            -- 將'ss'整體 追加為列表最後一個元素
    2. li.clear()
            -- 清空列表
    3. li.copy()
            -- 淺拷貝
            -- v = li.copy()
    4. li.count('ss')
            -- 計數元素'ss'有幾個
 ★ 5. li.expand(可迭代物件-- 如:列表,字串)
            -- 擴充套件列表(取可迭代物件裡的元素)
    6. li.index('ss')
            -- 索引元素下標(位置),找到第一個就結束
            -- 可傳入 start、end 來圈定區間
 ★ 7. li.insert(2,'ss') 下標,值
            -- 插入元素至指定位置
    8. li.pop(下標)
            -- 刪除,預設預設刪除最後一個元素
            -- 傳入下標,刪除指定位置的元素
            -- 可接收所刪除的元素的值 v = li.pop()
    9. li.remove('ss')
            -- 刪除指定的元素,找到第 一個就結束
            -- 不可預設,不可接收
    #### 刪除 ####
    #### pop remove del clear ####
    10. li.reverse()
            -- 翻轉,將列表元素順序翻轉
    11. li.sort()
            -- 排序,預設:從小到大對元素排序
            -- ( reverse = True ):從大到小排
            -- 列表元素型別必須全是數字


5.元祖 tuple :
    -- tu = ( 11,'ss',[],(),22,33 , )
    -- 有序,可理解為不可修改的列表 -- 元祖的一級元素不可被 修改、增加、刪除
                               -- 二級或更高的可以被修改
    -- 想修改時可 與 list靈活轉換
    1. 支援 索引、切片
    2. 支援 for迴圈
    3. str list tuple 三個可迭代物件 :可互相強制型別轉換,join可用

    ######### 方法 #########
    1. tu.count('ss')
        -- 計數元素 'ss' 有幾個
    2. tu.index('ss')
        -- 索引元素 'ss' 位置


6.字典 dict :     按雜湊表儲存
    -- dic = {
        'v1' : 'k1' ,  # 鍵值對
        'v2' : 'k2'
        }
    -- 無序,可修改
    -- 字典的key 不可以是 :列表 字典
    -- 字典的value :任何值都可以

    -- 索引:(取值)
        -- v = dic['v1']
        -- 結果:v =
        -- 若沒有,報錯
    -- 刪除:
        -- del:
            -- del dic[key]
    -- 不支援 while 迴圈
    -- 支援 for 迴圈
        -- 迴圈下一級key:
            -- for i in dic:
            -- for i in dic.keys() :
        -- 迴圈下一級value:
            -- for i in dic.values() :
        -- 迴圈下一級鍵值對:
            -- for i,j in dic.items() :

    ################### 字典的 方法 ###################
    重要:keys values items get update
    #### 普通方法 ####
    1. dic.clear()
        -- 清空
    2. dic.copy()
        -- 淺拷貝
 ★ 3. dic.get(key,若沒有返回的值)
        -- 索引取值
        -- 若沒有,不報錯,返回指定值
 ★ 4. dic.keys()  dic.values()  dic.items()
        -- 返回所有資訊,為特殊型別,類似於可迴圈的列表
    5. dic.pop(key,若沒有返回的值)
        -- 刪除key對應的值
        -- 所刪除的值可用 v= 接收
        -- 若沒有,不報錯,返回指定值
    6. dic.popitem()
        -- 隨機刪一個鍵值對
    7. dic.setdefalt(key,value)
        -- 設定一個新鍵值對的預設值(可理解為新增一個鍵值對)
        -- 若該key已存在,則不再設定
        -- 可用 v= 接收到該key對應的當前值
 ★ 8. dic.update(鍵值對或字典)
        -- 更新字典元素
        -- 無則新增,有則覆蓋
        -- 第二種寫法( key1=value1, key2=value2 )

    #### 靜態方法 ####
    1. dict.fromkeys(序列,value)
        -- 建立字典,{
                      序列的每個元素 :統一的值
                      序列的每個元素 :統一的值
                      ...
                    }
        -- 序列可為: 列表、字串 等




######################## 整理 ###########################

一、數字
    1. int()

二、字串
    1. replace find join strip split startswith upper format

三、列表
    1. append extend insert
    2. 索引 切片 迴圈

四、元祖(不可修改的列表)
    ★ 一級元素不能被修改 增加 刪除
    1. count index 都不重要
    2. 索引 切片 迴圈

五、字典(鍵不可修改,值可修改)
    ★ 無序不能切片,可修改
    1. get update keys values items
    2. for迴圈 索引

六、布林值

    1. bool()
    2. False值:0 None '' [] () {}


######################## 變數、資料型別 總結 ###########################

-- 是否可變:
1.可變:列表,字典
2.不可變:字串,元祖

-- 訪問順序:
1.順序訪問:字串,列表,元祖
2.對映訪問:字典(訪問速度快,但佔用記憶體多)

-- 存放元素個數:
1.原子型別:數字,字串
2.容器型別:列表,元祖,字典




二、邏輯:
1.條件:
	1. 要加冒號
	2. elif:
	3. and 與 or 優先順序一樣,嚴格按照先後順序執行
2.迴圈:(也要加冒號)
	1. 死迴圈:while True:
	2. 迴圈10次:
	
		count = 0
		while count <10 :
			count +=1

			...
			...
			
3. continue後的內容不執行,可用於跳過某個特殊條件
4. break 跳出迴圈

2.補充

####### 知識點 #######

# 1. 輸入輸出

'''
name = input ('ID:')
password = input('PassWord:')
print("hello world !")
'''

# 2. 數字

'''
a1 = 2
a2 = 3
a3 = a1 / a2
a4 = a1 ** a2
a5 = a2 % a1
print( '除法:' , a3 , '\n' 	+	'次方:', a4 , '\n' 	+	'取餘:' , a5 , '\n' )	# 最好直接寫3個 print()	
'''

######## 練習題 #######


# 考點:
# 1. if條件語句
# 2. while迴圈
# 3. 奇偶數


# 1. 使用while迴圈輸出 123456 8910

'''
count = 0
while count < 10 :
	count += 1		 	# 先寫,容易忘(此時,count已經+1了,相當於從1開始)
	if count != 7 :
		print(count)
	else :
		pass
'''

# 2. 求1-100所有數的和

'''
count = 0
sum1 = 0
while count < 100 :
	count += 1
	sum1 = sum1 + count
print(sum1)
'''	

# 3. 輸出1-100所有奇數
'''
count = 0
while count < 100 :
	count += 1
	if count % 2 == 1 :
		print(count)
'''	

# 4. 輸出1-100所有偶數

'''
count = 0
while count < 100 :
	count += 1
	if count % 2 == 0 :
		print(count)
'''

# 5. 求1-2+3-4+5...99

'''
count = 0
sum1 = 0
while count < 99 :
	count += 1
	if count % 2 == 1 :
		sum1 = sum1 + count
	else :
		sum1 = sum1 - count
print(sum1)
'''
	
# 6. 使用者登入(三次機會)

'''
count = 0
while count < 3:
	count += 1
	id = input ('please input your id:')
	password = input ('please input your password:')
	if id == 'shendaw' and password == '163':
		print ('login successful!')
		break
	else :
		print ('login failed!')
'''


################### 字串 ####################

################ 練習題 ###############
# 例題 . 使用者輸入字串,列印其每個字元及其對應的索引
# 題眼:以len作為range
'''
test = input('>>>')
for i in range(len(test)) :
    print(i,test[i])
'''
### 1.執行 python 指令碼的2種方式

# -- 1. 編輯好檔案後 執行檔案
# -- 2. python 直譯器 現場互動 寫一句執行一句


### 2. 簡述 位、位元組 的關係

# -- 1位元組 = 8位


### 3. 簡述 ascii unicode utf8 gbk 關係

# -- ascii : 1位元組 (7位 0-126)
# -- unicode : 萬國碼 字符集 至少2位元組
# -- utf8 :Unicode壓縮版 編碼規則 漢字3位元組
# -- gbk :漢字編碼規則 2位元組

### 10. 字串操作

# a. 移除兩頭空格
'''
name = '  aleX'
v = name.strip('a')
print(v)
'''
# b. 判斷開頭是否為 al
'''
name = 'aleX'
v = name.startswith('al')
print(v)
'''
# c. 判斷結尾是否為 X
'''
name = 'aleX'
v = name.endswith('X')
print(v)
'''
# d. 將 l 替換為 p
'''
name = 'aleX'
v = name.replace('l','p')
print(v)
'''
# e. 根據 l 分割 (分割後變為列表型別)
'''
name = 'aleX'
v = name.split('l')
print(v,type(v))
'''
# f. 變大寫
'''
name = 'aleX'
v = name.upper()
print(name,v)
'''
# g. 變小寫
'''
name = 'aleX'
v = name.lower()
print(name,v)
'''
# h. 輸出第2個字元
'''
name = 'aleX'
v = name[1]
print(name,v)
'''
# i. 輸出後2個字元
'''
name = 'aleX'
v = name[-2:]
print(v)
'''
# j. 輸出 e 下標
'''
name = 'aleX'
v = name.find('e')
print(v)
'''
# k. 獲取子序列,僅不包含最後一個字元
# 法一:
'''
name = input('>>>')
v = name[:-1]
print(v)
'''
# 法二:
'''
name = input('>>>')
l = len(name)
for i in range(0,l-1) :
    print(name[i])
'''

### 21. 字串是否可迭代,如是,用for迴圈
'''
name = input('>>>')
for i in name :
    print(i)
'''

### 22. 用下劃線 連線 字串裡的字元
'''
name = input('>>>')
v = '_'.join(name)
print(v)
'''

### 22. 用下劃線 連線 列表裡的元素
'''
name = ['sfdsdf','asfd','safggs']
v = '_'.join(name)
print(v)
'''

### 23. range 在 python2 和 python3 裡的區別:

# python2 裡 : 直接全部建立在記憶體裡
# python3 裡 : 迴圈時才一個一個建立
'''
    for i in range(100,0,-1):
        print(i)
'''

### 24. 整數加法計算器:
'''
n = input('>>>')
l = n.split('+')
n1 = int( l[0].strip() ) 
n2 = int( l[1].strip() )
re = n1 + n2
print(l,re)
'''

'''
test = 'sdkflslkfjsslk'
v = test.split('s',1)
print(v)
'''


### 25. 統計 數字 、 字母 個數:

'''
num = 0
alpha = 0
test = input('>>>')
for i in test :
    if i.isdecimal() :
        num += 1
    if i.isalpha():  
        alpha += 1
print(num,alpha)
'''

### 27. 製作模板
'''
name = input('name:')
location = input('location:')
hobby = input('hobby')
result = '可愛的' + name + '最喜歡在' + location + '幹' + hobby
print(result)
'''

'''
name = input('name:')
location = input('location:')
hobby = input('hobby:')

result = '可愛的{0}最喜歡在{1}幹{2}'
result = result.format(name,location,hobby)
print(result)
'''

### 28. 製作隨機驗證碼,不區分大小寫




### 29. 過濾敏感詞彙
'''
test = input('>>>')
new = test.replace('蒼老師','***')
new = new.replace('東京熱','***')
print(new)
'''

### 30. 製作表格 ,迴圈輸入,檢測到輸入為 q 或 Q 停止錄入,超過20字元以20個計
'''
result = 'name:\t'.expandtabs(25) + 'password:\t'.expandtabs(25) + 'email:\t\n'.expandtabs(25)
while True :

    name = input('name:')[:20] + '\t'
    if name.strip().lower() == 'q' :
        break
    name = name.expandtabs(25)

    password = input('password:')[:20] + '\t'
    password = password.expandtabs(25)

    email = input('email:')[:20] + '\t\n'
    email = email.expandtabs(25)

    result = result + name + password + email

print(result)
'''

# 改進!牛逼!用了模板format 和 expandtabs最後加 !!!
'''
template = '{}\t {}\t {}\t\n'
result = template.format('name:','password:','email:')
while True :
    name = input('name:')[:20]
    if name.strip().lower() == 'q' :
        break
    password = input('password:')[:20]
    email = input('email:')[:20]
    result = result + template.format(name,password,email)
    result = result.expandtabs(25)
print(result)
'''





3.總習題20個

################# 1. 用 下劃線 將列表元素拼接為一個字串

# li = ['a','b','k']
# v = '_'.join(li)
# print(v)

################# 3. 列表操作

# li = ['a','b','k']
# del li[2]
# print(li)

################ 5. 元祖操作
# 1.計算元祖長度並輸出
# 2.獲取元祖第二個元素並輸出
# 3.獲取1-2個元素並輸出
# 4.for迴圈輸出元素
# 5.for,len,range輸出元祖索引
# 6.enumrate輸出元素和序號(序號10開始)

# tu = ('a','b','c')
# v = enumerate(tu,10)
# for i,j, in v :
#     print(i,j)

################ 6. 元祖操作

# tu = ('alex',[11,22,{'k1':'v1','k2':['age','name'],'k3':(11,22,33)},44])
#
## tu[1][2]['k2'].append('seven')
# tu[1][2]['k3']=(111111)
#
# print(tu)



######################################### 10. 輸出商品列表
# 使用者輸入序號,顯示使用者選中的商品
# 商品 li = ['手機','電腦','滑鼠','鍵盤']
# 要求: 允許使用者新增商品

# li = ['手機','電腦','滑鼠','鍵盤']
# while True:
#     for i in range(len(li)) :
#         print(i,li[i])
#     n1 = input('please choose what you want:')
#     if n1.isdecimal() : # 判斷格式是否正確
#         n1 = int(n1)    # 強制轉換為數字
#     else :
#         print('the content format is wrong,please enter again!')
#         continue
#     print('the item you selected:', li[n1])
#
#     n2 = input('please input the item you want to add:')
#     if n2 != '' :   # 使用者輸入的 n2非空,才新增
#         li.append(n2)

############################################## 11. 使用者互動顯示 n級聯動選擇
# 如: 省市縣
# 要求: 允許使用者增加內容
# 南京市 = [1,2,3]
# 宿遷市 = [4,5,6]
# 杭州市 = [7,8,9]
# 金華市 = [10,11,12]
#
# 江蘇省 = [南京市,宿遷市]
# 浙江省 = [杭州市,金華市]
#
# 中國 = [江蘇省,浙江省]
# for i in 中國 :
#     print(i)
       
# 1. 字典法:
dic = {
         '江蘇省':{
                    '南京市':[1,2,3],
                    '蘇州市':[4,5,6],
                    '宿遷市':[7,8,9]
                 },
         '浙江省':{
                    '杭州市': [1,2,3],
                    '金華市':[4,5,6]
                 },
         '廣西省':{
                    '南寧市': [1,2,3],
                    '桂林市':[4,5,6],
                    '貴港市':[7,8,9]
                 }
}

province = input('輸入省:')
for i in dic[province]:
    print(i)

city = input('city:')
for i in dic[province][city]:
    print(i)


############################################## 12. 列舉布林值是 False的所有值

# 0 '' False
# [] () {}
# None

# #################################### 13. 對 2個列表:
#     l1 = [11,22,33]
#     l2 = [22,33,44]
#     a. 獲取內容相同的元素列表
#     b. l1有,l2沒有的元素列表
#     c. l1沒有,l2有的元素列表
#     d. 獲取內容都不相同的元素

# l1 = [11,22,33]
# l2 = [22,33,44]
# v = []
# for i in l1 :
#     if i in l2:
#         v.append(i)
# print(v)

# l1 = [11,22,33]
# l2 = [22,33,44]
# v = []
# for i in l1 :
#     if i not in l2:
#         v.append(i)
# print(v)

# l1 = [11,22,33]
# l2 = [22,33,44]
# v = []
# for i in l2 :
#     if i not in l1:
#         v.append(i)
# print(v)

# l1 = [11,22,33]
# l2 = [22,33,44]
# v = []
# for i in l1 :
#     if i not in l2:
#         v.append(i)
# for i in l2 :
#     if i not in l1:
#         v.append(i)
# print(v)  18.48

########################################## 14. 利用 for迴圈和range輸出:
#     a. for迴圈從大到小輸出 1 - 100
#     b. for迴圈從小到大輸出 100 - 1
#     c. while迴圈從大到小輸出 1 - 100
#     d. while迴圈從小到大輸出 100 - 1

# for i in range(1,101) :
#     print(i)

# for i in range(100,0,-1) :
#     print(i)

# count = 0
# while count < 100 :
#     count += 1
#     print(count)

# count = 101
# while count >1 :
#     count -= 1
#     print(count)

####################################################### 15. 購物車
#     功能要求:
#         要求使用者輸入總資產
#         顯示商品列表,使用者根據序號選擇商品加入購物車
#         購買,若商品總額大於資產餘額不足,否則購買成功
#     goods = [
#         {'name':'電腦','price':1999}
#         {'name':'滑鼠','price':10}
#         {'name':'鍵盤','price':20}
#         {'name':'老婆','price':998}
#     ]

# goods = [
#     {'name': '電腦', 'price': 1999},
#     {'name': '滑鼠', 'price': 10},
#     {'name': '鍵盤', 'price': 20},
#     {'name': '老婆', 'price': 998}
# ]
# for i in goods :
#     n = goods.index(i)
#     print(n,i)
# n1 = input('輸入資產:')
# n1 = int(n1)
# n2 = input('輸入編號:')
# n2 = int(n2)
# if n1 >= goods[n2]['price'] :
#     print('purchase success!')
# else :
#     print('insufficient balance!')

######################################## 16. 分頁顯示內容
# a. 通過for迴圈建立301條資料,資料型別不限,如:
#     alex-1      [email protected]      pwd1
#     alex-2      [email protected]      pwd1
#     alex-3      [email protected]      pwd1
#     alex-4      [email protected]      pwd1
#     ...
# b. 提示使用者輸入頁碼,顯示該頁資料
#
# 注意:每頁顯示10條資料
#     若輸入的不是十進位制數字則提示格式錯誤

# 1.字串模板法:
# template = 'alex-{}\t alex{}@live.com\t pwd{}'
# test = []
# for i in range(1,302) :
#     v = template.format(i,i,i)
#     test.append(v)
# n1 = input('page:')
# n1 = int(n1)
# for i in range(10*n1-10, min(10*n1,301) ) :
#     print(test[i])

# 2.字典法:
# li = []
# for i in range(301):
#     temp = {'name':'alex'+str(i),
#             'email':'alex'+str(i)+'@163.com',
#             'pwd':'pwd'+str(i)
#             }
#     li.append(temp)
# page = input('page:')
# page = int(page)
# for i in range((page-1)*10,min(301,page*10)) :
#     print(li[i])

################################################# 17. 數字 1,2,3,4,5,6,7,8
# 能組成多少個互不相同且無重複數字的 2位數

# li = [1,2,3,4,5,6,7,8]
# count = 0
# for i in li :
#     for j in li :
#         if i != j :
#             count += 1
# print(count)

################################################ 18. 用 for迴圈和range輸出 9*9 乘法表

# str0 = ''
# for j in range(1,10) :
#     for i in range(1,10):
#         if i <= j :
#             r = i*j
#             str0 += str(i)+'*'+str(j)+'='+str(r)+'\t'
#     print(str0)
#     str0 = ''


# for j in range(1,10) :
#     for i in range(1,10):
#         if i <= j :
#             r = i*j
#             print(i,'*',j,'=',r,end = '\t')
#     print('')



################################################ 19. 找出一列表中任 2元素相加 =9的元素集合 [(4,5),(3,6)]

# nums = [2,7,11,15,1,8,7]
# r = []
# for i in nums :
#     for j in nums :
#         if i!=j and i+j == 9 :
#             r.append((i,j))
# print(r)

############################################### 20. 百錢買百雞
# 公雞1只 5元
# 母雞1只 3元
# 小雞1只 1/3元
# 要求:100元買100只雞,三種都要有
# 問:各買幾隻?

# for a in range(1,20) :
#     for b in range(1,67) :
#         for c in range(1,98) :
#             if 5*a + 3*b + c/3 == 100 and a+b+c == 100 :
#                 print((a,b,c))




4.集合

1.集合:(set : 可變,不可修改)
        (frozenset : 不可變集合)
    1.無序
    2.元素必須是不可修改型別
    3.元素不同(相同的元素無效)

2.應用:
    簡單去重:(會打亂順序)
        強制轉換為集合,再轉換回去

3.set方法:

    1. 新增1個元素
        -- s.add()

    7. 新增多個元素
        -- s1.update([1,2,3])

    2. 清空
        -- s.clear()

    3. 拷貝
        -- s.copy()

    4. 刪除(隨機刪一個元素)
        -- s.pop()

    5. 刪除(指定元素)(不存在會報錯)
        -- s.remove('s')

    6. 刪除(指定元素)(不會報錯)
        -- s.discard('s')

    7. 取交集
        -- s3 = s1 & s2
        -- s3 = s1.intersection(s2)

    8. 取並集
        -- s3 = s1 | s2
        -- s3 = s1.union(s2)

    9. 取差集(s1 - 相同部分)
        -- s3 = s1 - s2
        -- s3 = s1.difference(s2)

    10. 交叉補集(s1+s2-相同部分)(互不相同部分)
        -- s3 = s1 ^ s2
        -- s3 = s1.symmetric_difference(s2)

    11. 判斷有無交集
        -- v = s1.isdisjoint(s2)

    12. 判斷s1是否為s2子集
        -- v = s1 <= s2
        -- v = s1.issubset(s2)

    13. 判斷s1是否為s2父級
        -- v = s1 >= s2
        -- v = s1.issuperset(s2)

二、字串格式化

一、% 方法


    s = 'i am %s , my age is %d'  %('shendaw',22)

        1. + 儘量不用,會開闢記憶體空間,效率低

        2. %s 萬能
            -- %.4s  (擷取字串前4位)

        3. %d 整型數字

        4. %f 浮點數(預設小數點後取6位)
            -- %.2f  (小數點後取2位)

        5. %% 百分號



二、format 方法

    # 一般方法
    --  s = 'i am {} , my age is {}' .format('shendaw',22)

    # 元祖索引方式取值
    --  s = 'i am {1} , my age is {0}' .format(22,'shendaw')
    --  s = 'i am {1} , my age is {0}' .format(*(22,'shendaw'))
    --  s = 'i am {1} , my age is {0}' .format(*[22,'shendaw'])

    # 字典方式取值
    --  s = 'i am {name} , my age is {age}' .format(name='shendaw',age=22)
    --  s = 'i am {name} , my age is {age}' .format(**{'name':'shendaw','age':22})

    # 強制轉換型別
    --  s = 'i am {:s} , my age is {:d}' .format('shendaw',22)

三、函式

1. 函式與過程:
        過程:沒有返回值的函式

2. 啥時候用函式:
        1. 減少重複程式碼 (有超過兩次的重複)
        2. 保持一致性(易維護)
        3. 增強可擴充套件性
        4. 封裝一個功能

3. 出現同名的函式:
        前面的都會被覆蓋掉,只有最後一個生效

4. 遇到第一個return即結束

5. def jj (x,y,z=6)
        z的預設值為6

6. 可變長度引數:

    def jj (x,y,*args)  #可變長度的列表(元祖)
    def jj (x,y,**kwargs) #可變長度的字典

    傳參:
    def jj (x,y,z):

    jj( *[1,2,3] ) #遍歷取元素


四、刷題 -- 劍指offer

''' 3. 輸出任一重複的數字 '''

s = input('please input the figers:')
li = s.split(' ')

print(li)

''' 50. 輸出第一個無【重複】的字元 '''

# 1. 用列表自帶的count方法----程式碼最簡單
# s = input('please input the string:')
# s = list(s)
# for item in s :
#     if s.count(item) == 1 :
#         print(item)
#         break

# 2. 構造輔助雜湊表(字典)----時間複雜度最小
# s = input('please input the string:')
# dic = {}
# # 建立雜湊表
# for item in s :
#     dic.update({item:0})
# # 向雜湊表填值
# for item in s :
#     dic[item] += 1
# # 以雜湊表輔助尋找次數 =1的字元
# for item in s :
#     if dic[item] = 1 :
#         print(item)
#         break

# 3. 建立兩個容器,一個放不同的,一個放重複的。
#    s1-s2得無重複的元素集合

# s = input('please input the string:')
#
# s1 = []
# s2 = set()
# for item in s:
#     if item not in s1 :
#         s1.append(item)
#     else :
#         s2.add(item)
# for item in s2:
#     s1.remove(item)
#
# print(s1[0])

五、刷題 -- 位元組跳動 -- leetcode

# 3. 無重複字元的最長子串

# v = input('請輸入字串:')
# def find_max_length_from_i(v) :
#     l = []
#     for i in range(len(v)) :
#         v_new = []
#         for j in range(i,len(v)) :
#             if v[j] not in v_new :
#                 v_new.append(v[j])
#             else:
#                 l.append(len(v_new))
#                 break
#             j += 1
#         i+=1
#     r = l.sort()
#     r = l[-1]
#     return r
#
# r = find_max_length_from_i(v)
# print(r)

############## 法二
# v = input('請輸入字串:')
# def hhh(v) :
#
#     t2 = []
#     for i in range(len(v)):
#         t1 = []
#         cnt= 0
#         for j in range(i,len(v)):
#
#             if v[j] not in t1:
#                 t1.append(v[j])
#                 cnt += 1
#             else:
#                 break
#             j += 1
#         t2.append(cnt)
#         i += 1
#     return max(t2)
#
# r = hhh(v)
# print(r)

'''
 10/9
'''
''' 1. 分類 -- 通過 '''
# test = input('please input the string:')
# res = 0
# n = len(test)
# for j in range(n) :
#     temp = []
#     for i in range(j,n) :
#         if i < n-1 :
#             if test[i] not in temp :
#                 temp.append(test[i])
#             else :
#                 len_temp = len(temp)
#                 if len_temp > res :
#                     res = len_temp
#                 break
#         else :
#             if test[i] not in temp :
#                 temp.append(test[i])
#                 len_temp = len(temp)
#                 if len_temp > res :
#                     res = len_temp
#             else:
#                 len_temp = len(temp)
#                 if len_temp > res :
#                     res = len_temp
# print(res)
''' 2. flag -- 未通過 '''
# test = input('please input the string:')
# res = 0
# n = len(test)
# for j in range(n) :
#     temp = []
#     flag = 0
#     for i in range(j,n) :
#         if i == n-1 or test[i] in temp :
#             flag = 1
#         if test[i] not in temp :
#             temp.append(test[i])
#         if flag == 1 :
#             len_temp = len(temp)
#             if len_temp > res:
#                 res = len_temp
#             break
# print(res)

''' 3. 實時更新 -- 未通過 '''
# test = input('please input the string:')
# res = []
# for j in range(len(test)) :
#     temp = []
#     for i in range(j,len(test)) :
#         if test[i] not in temp :
#             temp.append(test[i])
#             print('temp:',temp)
#             print('res:',res)
#             if len(temp) > len(res) :
#                 res = temp
#                 print('更新!')
#         else :
#             break




六、刷題 -- 位元組跳動 -- 牛客網

   ''' 
        血的教訓:面試題
        # 題目:將陣列nums中所有0放到結尾去
        # 錯因:刪除導致迴圈溢位、下標漏掉元素
        # 經驗:刪除、迴圈溢位、下標漏元素 ———— 建立新容器
   '''

# nums = [1,0,2,4,6,0,0,3]
# res = []
# cnt = 0
# for i in range(len(nums)) :
#     if nums[i] != 0 :
#         res.append(nums[i])
#     else :
#         cnt += 1
# for i in range(cnt) :
#     res.append(0)
#
# print(res)


'''
1、萬萬沒想到之聰明的編輯
'''
####### 1. 刪除法 - 失敗 ######

# test1 = input('請輸入字串:')
# test1 = list(test1)
# for i in range(len(test1)-2):
#     if test1[i] == test1[i+1]:
#         if i+2<len(test1)-1 and test1[i+2] == test1[i+1]:
#             test1.pop(i+2)
#         elif i+3<len(test1)-1 and test1[i+2] == test1[i+3]:
#             test1.pop(i+2)
# print(test1)

####### 2. 新增法 -成功 ######

# 分次輸入 — 簡單
# n = int(input())
# while n:
#     test1 = input()
#     test1_new = []
#     for i in range(len(test1)):
#         if i>=2 and test1[i-2] == test1[i-1]:
#             if test1[i] == test1[i-1]:
#                 continue
#             elif i<len(test1)-1 and test1[i] == test1[i+1]:
#                 continue
#             else :
#                 test1_new.append(test1[i])
#         else:
#             test1_new.append(test1[i])
#
#     print(''.join(test1_new))
#     n-=1


# 連續輸入 - 較麻煩
# n = int(input('請輸入n:'))
# n1 = n
# test = []
# while n:
#     test.append(list(input('請輸入字串:')))
#     n-=1
#
# for j in range(n1):
#     test_new = []
#     for i in range(len(test[j])):
#         if i>=2 and test[j][i-2] == test[j][i-1]:
#             if test[j][i] == test[j][i-1]:
#                 continue
#             elif i<len(test[j])-1 and test[j][i] == test[j][i+1]:
#                 continue
#             else :
#                 test_new.append(test[j][i])
#         else:
#             test_new.append(test[j][i])
#
#     print(''.join(test_new))
#     n-=1


########### 大佬解法 ########

# n = int(input())
# while n > 0:
#     s = input()
#     res = []
#     for e in s:
#         if len(res) < 2:
#             res.append(e)
#             continue
#         if len(res) >= 2:
#             if e == res[-1] and e == res[-2]:
#                 continue
#         if len(res) >= 3:
#             if e == res[-1] and res[-2] == res[-3]:
#                 continue
#         res.append(e)
#     print("".join(res))
#     n -= 1


# 2. 萬萬沒想到之抓捕孔連順
# 初步可行:
# s = input()
# n,d = s.split(' ')
# n = int(n)
# d = int(d)
# b = input().split(' ')
# cnt = 0
# for i in range(n-2):
#     for j in range(i+1,n-1):
#         for k in range(j+1,n):
#             if int(b[k]) - int(b[i]) <= d :
#                 cnt+=1
# print(cnt)

# s = input()
# n,d = s.split(' ')
# n = int(n)
# d = int(d)
# b = input().split(' ')
# cnt = 0
# for i in range(n-2):
#     for j in range(i+1,n-1):
#         if int(b[j]) - int(b[i]) <= d :
#             for k in range(j+1,n):
#                 if int(b[k]) - int(b[i]) <= d :
#                     cnt+=1
# print(cnt % 99997867)


# 自由落體

# import time
#
# time_start=time.time()
# while True:
#     t = time.time() - time_start
#     y = 0.5*9.8*t**2
#     print('(0,%s)' %y)