筆記--Day2--python基礎2

来源:http://www.cnblogs.com/apff/archive/2017/09/23/7467937.html
-Advertisement-
Play Games

一、雞湯 1.提高自我修養 2.人醜就要多讀書 3.多走走,開拓眼界 二、目錄: 1.列表、元組操作 2.字元串操作 3.字典操作 dict是無序的 key必須是唯一的 4.集合操作 集合是一個無序的,不重覆的數據組合,它的主要作用如下: 去重,把一個列表變成集合,就自動去重了 關係測試,測試兩組數 ...


一、雞湯

1.提高自我修養

2.人醜就要多讀書

3.多走走,開拓眼界

二、目錄:

1.列表、元組操作

2.字元串操作

3.字典操作

  • dict是無序的
  • key必須是唯一的

4.集合操作

集合是一個無序的,不重覆的數據組合,它的主要作用如下:

  • 去重,把一個列表變成集合,就自動去重了
  • 關係測試,測試兩組數據之前的交集、差集、並集、子集、對稱差集(反向差集)等關係

5.文件操作

 文件操作流程:

  1. 打開文件,得到文件句柄並賦值給一個變數
  2. 通過句柄對文件進行操作
  3. 關閉文件 

 文件操作模式:

  • r,只讀模式(預設)。
  • w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
  • a,追加模式。【可讀;   不存在則創建;存在則只追加內容;】

"+" 表示可以同時讀寫某個文件

  • r+,可讀寫文件。【可讀;可寫;可追加】
  • w+,寫讀
  • a+,同a

"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示處理二進位文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進位文件時需標註)

  • rb
  • wb
  • ab

6.字元編碼與轉碼

Python2中的字元串進行字元編碼轉換過程是:

  •    位元組串-->decode('原來的字元編碼')-->Unicode字元串-->encode('新的字元編碼')-->位元組串

Python3中定義的字元串預設就是unicode,因此不需要先解碼,可以直接編碼成新的字元編碼:

  • 字元串-->encode('新的字元編碼')-->位元組串

 



三、練習

1.列表元組操作練習

#pycharm 5.0.3(python3.6)
#定義一個空列表
names = []
print('列印空列表names:',names)
#定義一個班級人員的列表
names = ['Alex','Felix','Fion','Susan']
#按下標取列表中的數據下標從0開始
print("取'Felix':",names[1])
#截取中間位置的人員 ,切片所取的位置包含其實位置,不包含結束位置(顧頭不顧尾)
print('切片_方法1_明確位置:',names[1:3])
print('切片_方法2_取末尾:',names[-1]) #從右開始往左數是-1,-2.。。
print('切片_方法3_取最後邊:',names[-3:-1]) #如果要取後3個的話,寫-1就不行了,只能取2個:
print('切片_方法4_取最後邊:',names[-3:]) #可以省略不寫,這樣就可以取多個了
print('切片_方法5_取前3:',names[0:3]) #起始位置可以寫0,也可以忽略
print('切片_方法5_取前3:',names[:3])  #同上
print('切片_方法6_按步長:',names[0:-1:2])
print('列表的增刪改查:'.center(40,'#'))
names.append('Bob') #追加_末位最佳
print('追加_末位追加:',names)
names.insert(1,'Jack') #追加_任意位置
print('追加_任意位置:',names)
names[2] = 'Wulin' #修改,將列表下邊是2的名稱修改掉
print('修改:',names)
names.remove('Wulin') #刪除
print('刪除_remove方式',names)
del names[1]
print('刪除_del方式',names)
print(names.pop())  #不帶下標,刪除最後一個並返回刪除的值
print('刪除_pop方式',names) #刪除後的結果
print('查找_找下標:',names.index('Fion'))#查找人員索引位置,沒有回報錯
print('查找_找下標_借下標列印出名稱:',names[names.index('Fion')]) #看似多此一舉
names.insert(1,'Fion')#班級姓名重覆的情況,可以統計重覆的個數
print('統計重覆個數:',names.count('Fion'))
#清除列表clear name.clear
names.reverse()#反轉
print('反轉:',names)
names.insert(3,'4zhang') #插入數字開頭的
names.insert(3,'!#woaini') #插入特殊字元開始的
names.sort()#排序
print('排序',names)
names2 = [12,34,5]
names.extend(names2)#將names2併入到name
print('列印合併後的兩個列表:',names)
print('以下為淺複製相關'.center(50,'-'))#以下淺複製相關,需要記住這個特性,儘管用的較少
#列表中可以包含列表
names.insert(0,['age','grade']) #向列表中插入一個列表 #print('列印包含列表的列表:',names)
names3 = names.copy()#後邊用到,淺copy,複製一個列表出來
print('列印copy前的列表:',names)
print('列印copy後的列表:',names3)
names[0][0] ='sex' #修改列表中列表的值
names[5] ='Wo' #修改names列表中Susan的名稱為Wo,然後對比複製前複製後列表值的變化
print('列印修改後的列表:',names)
print('列印copy後的列表:',names3)
#對比以上4個列印結果可以發現,列表中列表的值names和names3都被修改了,但是列表中的值只有names裡邊被修改了,這個叫淺copy
#即只copy了第一層,由於列表中的列表只是個記憶體地址,所以修改names的列表中的列表的值後names3中的也跟著變了。
print('以下為深copy相關'.center(50,'-'))#一下深複製相關,不隨便用,通常不需要隨便複製一份(比如數據比較大的情況)
import copy #此時需要用到copy模塊
print('列印深copy前的列表:',names)
names4 = copy.deepcopy(names) #調用copy模塊的深copy
names[0][0] = 'home' #修改列表中列表的值
print('列印深copy後的列表:',names)
print('列印深copy後的列表:',names4) #可以發現列表沒有變化
print('以下為列表的迴圈'.center(50,'-')) #
for i in names:
    print(i)
print('以下為淺複製的一個場景'.center(50,'-'))
person = ['name',['saving',100]]
'''
#3中淺copy方式
p1 = copy.copy(person) #
p2 = person[:] #切片
p3 = list(person) #工廠函數
#淺copy什麼情況下比較有用
'''
#有以下兩個人,都基於person複製過來,兩人有一個共同賬號,如果一個少了50則另一個發現也少了50
p1 = person[:]
p2 = person[:]
p1[0]='Felix'
p2[0]='Fiona'
p1[1][1] =50  #公共賬號少了50,那麼兩個人發現都少了50
print(p1)
print(p2)
列表代碼 元組代碼

2.字元串操作練習

#pycharm 5.0.3(python3.6)
name = 'my \tname is felix {first},my age is {age}'
#pycharm有提醒功能,當輸入name.的時候就會提醒字元串都有哪些操作,有兩個下劃線開始結尾的不用管
print('首字母大寫:',name.capitalize())
print('統計個數',name.count('i'))
print('總共50個字元,不夠的用-補齊:',name.center(50,'-'))
print('以什麼結尾,匹配上則為真:',name.endswith('x'))
print('將tab轉為多少個空格:',name.expandtabs(tabsize=20)) #在變數值中插入一個tab
print('查找,返回值所在的位置',name.find('is'))
#字元串的切片
print('字元串的切片:',name[name.find('is'):11])
print('格式化字元串,向{}中傳值:',name.format(first='Song',age=23))
print('格式化字元串,傳字典形式的值:',name.format_map({'first':'Song','age':12}))
print('ab23!'.isalnum()) #'是否是阿拉伯數字,如果裡邊有特殊字元返回false
print('ab'.isalpha())#是否是存英文字元
print('1A'.isdecimal())#是否是十進位
print('10'.isdigit())#是否是整數
print('1A'.isidentifier()) #是否是一個合法的標識符 關註變數的命名規則,不符合的則為False
print('A'.islower()) #判斷是不是小寫
print('22'.isnumeric()) #判斷是不是一個數字,只識別整數
print(' '.isspace())#是否是空格
print('my name is '.istitle()) #判斷一個字元串是不是title,每個首字母大寫
print(''.isprintable())#是否可以列印,字元串不用考慮,比如還是tty文件
print('s'.isupper())#判斷是不是大寫
print('+'.join(['1','2','3','4']))#將列表中的字元串用某一個字元連接
print(name.ljust(50,'*')) #和center類似,50個字元,不夠的用*號補齊
print(name.rjust(50,'*'))
print('FELIX'.lower())#把大寫變成小寫
print('felix'.upper())#把大寫變成小寫
print('\nFelix'.lstrip())# strip預設會去除兩邊預設的空格回車 ,lstrip是去除左邊的空格回車
print('Felix\n'.rstrip())
print('Felix\n'.strip())# strip預設會去除兩邊預設的空格回車
print('------')
p = str.maketrans('abcdef','123456') # 做映射,可以做隨機密碼來玩
print('Felix'.translate(p))#
str = 'http://www.baidu.com/index'
print(str.partition('://'))#從左邊找指定的分隔符將字元串進行分割
#返回一個3元的元組,第一個為分隔符左邊的子串,第二個為分隔符本身,第三個為分隔符右邊的子串。
print('Felix'.replace('i','I'))
print('felix songi'.rfind('i')) #從做往右,找到最右邊那個值的下標返回
print('123'.rindex('3'))#返回子字元串 str 在字元串中最後出現的位置,如果沒有匹配的字元串會報異常
str = 'http://www.baidu.com/index'
print(str.rpartition('/'))##從右邊找指定的分隔符將字元串進行分割
print('fe li xl'.split(' '))
print('fe li\n xl'.splitlines()) #按換行來分
print('felix'.startswith('f')) #判斷是否是什麼開頭的
print('Felix Song'.swapcase()) #大寫邊小寫,小寫邊大寫
print('Felix Song'.zfill(50)) #50個字元不夠數的用0填充
練習代碼

3.字典操作練習

#pycharm 5.0.3(python3.6)
#定義一個欄位(key-value格式)
info = {
    'stu1101':'TengLan Wu',
    'stu1102':'LonZe Luola',
    'stu1103':'XiaoZe Maliya',
        }
print(info) #字典是無序的
#查,方法1,如果key不存在的話會出錯
print('取字典中某一個key對應的值:',info['stu1101'])
#查,方法2,有就返回,沒有就返回none,這是一種安排的方法
print(info.get('stu1104'))
#查,方法3,判斷key在不在,不在就返回False
print('stu1104' in info)
#
info['stu1101'] = '武藤蘭'
#增,當key值不存在的時候會增加
info['stu1104'] ='Cangjingkong'
print(info)
#刪除 del是python中的一個通用方法
del info['stu1101']
print(info)
#刪除,pop刪除,
info.pop('stu1102')
print(info)
#刪除,popitem,隨機刪除
info.popitem()
print(info)
#更新update,
b = {
    'stu1101':'Felix',
    1:3,
    2:5
}
info.update(b) #合併兩個欄位,有交叉則更新,沒有則創建
print(info)
#fromkeys與info沒什麼關係,初始化一個列表,這個地方有個坑
c = info.fromkeys([6,7,8],[1,{'name':'alex'},444]) #相當於創建了一個字典
print(c)
c[7][1]['name'] = 'Fiona'#修改的時候會把fromkeys值都修改,類似於一個淺copy
print(info.items()) #將字典變成了大的列表
基本操作
#字典可以多級嵌套字典
China ={
    '北京':{
        '昌平':{
            '沙河':['oldboy','test'],
            '天通苑':['鏈家地產','我愛我家'],
        },
        '朝陽':{
            '望京':['賓士','陌陌'],
            '國貿':['CICC','HP'],
            '東直門':['Adent','wwo']
        },
     '廣東':{
        '東莞':{},
        '佛山':{},
        '廣州':{},
    },
    }
}
#修改東直門下的公司名稱(key儘量不要寫中文)
China['北京']['朝陽']['東直門'][1] = 'Kaitong'
print(China)
#列印所有不包含key的值
print(China.values())
#列印所有key值
print(China.keys())
#setdefault 如果字典不存在可以新增,存在則返回key所對應的值
China.setdefault('陝西',{'寶雞':{}})
China.setdefault('北京',{})
print(China)
print(China.setdefault('北京',{}))
多級嵌套
#pycharm 5.0.3(python3.6)

info = {
    'stu1101':'TengLan Wu',
    'stu1102':'LonZe Luola',
    'stu1103':'XiaoZe Maliya',
        }
for i in info:
    print(i) #只是列印了key
for i in info:
    print(i,info[i]) #列印key和value,建議的迴圈方式
#上邊的效果和下邊的一致,但是上邊的效果高,因為有一個字典轉變為列表的過程
for k,v in info.items():
    print(k,v)
字典的迴圈

 

4.集合操作練習

#pycharm 5.0.3(python3.6)
#定義列表,集合;列表轉變為集合的方式就是用set()框起來
list_1 = [20,1,4,5,7,3,6,7,9]
list_1 = set(list_1)

list_2 = set([2,6,0,66,22,8,4])
print(list_1,type(list_1))
print(list_2,type(list_2))

#交集
print('交集:',list_1.intersection(list_2))
print('交集運算符',list_1 & list_2)
#並集
print('並集:',list_1.union(list_2))
print('並集運算符:',list_1 | list_2)
#差集
print('差集(1有2沒有):',list_1.difference(list_2))
print('差集(2有1沒有)',list_2.difference(list_1))
print('差集運算符(1有2沒有)',list_1 - list_2)
print('差集運算符(2有1沒有)',list_2 - list_1)
list_3 = set([1,3,7])
#子集 (前邊的是不是後邊的子集或者父集),子集沒有專門的運算符
print('子集(1是不是2的子集):',list_1.issubset(list_2))
#父集
print('父集(1是不是2的父集):',list_1.issuperset(list_2))
print('子集(1是不是3的子集):',list_1.issubset(list_3))
print('父集(1是不是3的父集):',list_1.issuperset(list_3))

#對稱差集(反向差集):把兩個都有的去掉
print('對稱差集',list_1.symmetric_difference(list_2))
print('對稱差集運算符',list_1 ^ list_2)
print('遺漏'.center(50,'#'))
#判斷兩個是否有交集,有返回fase,沒有返回true
list_4 = set([5,6,8])
print(list_4.isdisjoint(list_3))
print(list_1.isdisjoint(list_2))

#pop 任意刪除一個,並返回一個值
print('刪除任意一個並返回其值:',list_1.pop())
print('刪除任意一個並返回其值:',list_1.pop())
#discard刪除一個值,如果值有則刪除,如果沒有返回空不報錯,remove會報錯
list_1.discard(7) #discard刪除一個值
print('discard刪除一個值後list_1結果:',list_1)
list_1.discard(1000)#刪除一個不存在的值,這裡什麼也不做也不會報錯
print('discard刪除一個值list_1結果::',list_1)

print('集合的增刪改查'.center(30,'-'))
#增加
list_1.add(2000)
print('增加一個:',list_1)
#增加多項
list_1.update([20,40,555])
print('增加多個:',list_1)
#刪除,值不存在的時候會報錯
list_1.remove(2000)
print('移除:',list_1)
#長度判斷
print('長度',len(list_1))
#成員判斷:判斷20是否在list_1中
print('成員判斷:',20 in list_1)
print('成員判斷:',1000 not in list_1)
#copy:淺複製
集合代碼

 

5.文件操作

#pycharm 5.0.3(python3.6)
#文件的打開、讀寫操作
#讀:
'''
f = open('yesterday2','r',encoding='utf-8') #打開文件 (此處如果不加編碼格式,windows預設編碼是gbk,而python預設是utf8
#的)所以需要指定編碼用utf-8打開文件
data = f.read() #文件打開了只是一個記憶體對象,所以需要賦變數的形式進行操作
data2 = f.read() #上邊讀完了,此時在讀的話是從末行開始讀,所以這裡讀的內容是空的。
print(data)
print('data2:',data2) #列印內容為空理解(讀文件的時候相當於是有個游標的東東,python會記錄游標的位置,我們要想從任意位置
#讀取的話就可以通過操作游標實現)
'''



#
'''
f = open('yesterday2','w',encoding='utf-8') #寫的話需要在open中加上打開文件的模式'w'(預設讀模式)
f.write('I love you Fiona,\n') #open模式中只寫‘w’相當於是創建一個文件*慎用*,會把原文件清空
f.write('very much')  #第一行內容不帶\n的話會寫在同一行
'''

'''
#'a' 追加的話需要在open中加上打開文件的模式(預設讀模式),相當於append(在末尾增加)
f = open('yesterday2','a',encoding='utf-8')
f.write('hahhhhhhh\n')
f.write('luhaluhaluha')
f.close() #寫完文件要把文件關閉
'''

#讀2行
'''
#readlin預設讀文件中的一行
f = open('yesterday','r',encoding='utf-8')
print(f.readline())
print(f.readline())
'''
#讀5行,可以用迴圈
'''
f = open('yesterday','r',encoding='utf-8')
for i in range(5):
    print(f.readline().strip()) #strip可以去除兩邊的換行和空格
'''

#需求:讀多行,readlines讀所有的文件,在第10行的位置列印一個分割線
'''
f = open('yesterday','r',encoding='utf-8')
#print(f.readlines()) #讀所有的行放到一個列表
#print(list(enumerate(f.readlines())))

#解決:通過for迴圈可以把這個列表的數據取出來,通過enumerate將列表的下標和值存成元組形式,然後在賦兩個值
for index,line in enumerate(f.readlines()):
     if index ==9:
         print('我是分割線')
         continue
     print(line.strip())
'''

#需求,readlines只適合讀小文件,讀大文件怎麼辦 :讀一行刪一行,記憶體只存一行
#此時文件變成了一個迭代器,無法通過枚舉取下標了
'''
f = open('yesterday','r',encoding='utf-8')
count = 0
for line in f:
    if count == 9:
        print('我是分割線')
        count += 1
        continue
    print(line)
f.close()
'''
文件操作
#pycharm 5.0.3(python3.6)
#需求:怎麼將游標移動,獲取想要列印的內容呢?
f = open('yesterday','r',encoding='utf-8')
print(f.tell()) #列印游標位置 ,按字元的個數計數
print(f.readline())
print(f.readline())
print(f.readline())
print('總共讀了幾個字元:',f.tell())
print('游標返回到第幾個字元:',f.seek(0)) #	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前我用的vs2017的版本是15.3.5。生成解決方案有時會提示如下: 開始以為是許可權的問題,找到相應的目錄設置everyone許可權,再次生成還是不行。重啟VS試了下,還是不行。 最後無奈重啟下電腦,再重新生成,終於沒有這個問題了。 可是好景不長,改了代碼,再次重新生成,又出現了這個問題,都快被逼 ...
  • dynamic是Framework4.0的新特性,dynamic的出現讓C#具有了弱語言類型的特性,編譯器在編譯的時候,不再對類型進行檢查,不會報錯,但是運行時如果執行的是不存在的屬性或者方法,運行程式還是會拋出RuntimeBinderException異常。 var 與 dynamic 的區別 ...
  • 最近.NET Core升級到2.0後開始慢慢搗鼓的多了起來,但遇到了不少坑,所以特來記錄下。 第一個坑 條件編譯符 我們在編寫一些方法的時候通常會為Debug模式增加一些輸出日誌等以便我們檢查,也會為Release模式增加或修改一些特定的參數,但今天我在寫這些的時候就遇到了這個坑#if !DEBUG ...
  • 背水一戰 Windows 10 之 控制項(WebView): 對 WebView 中的內容截圖, 通過 Share Contract 分享 WebView 中的被選中的內容 ...
  • lintcode :First Unique Number In Stream ...
  • 近期,DataCamp發佈了jupyter notebook的 cheat sheet,【Python數據之道】第一時間與大家一起來分享下該cheat sheet的內容。 以下是該cheat sheet的部分內容: 各位小伙伴可以從DataCamp的網站獲取該cheat sheet的pdf版,當然, ...
  • 題目描述 如圖所示為某生態系統的食物網示意圖,據圖回答第1小題現在給你n個物種和m條能量流動關係,求其中的食物鏈條數。物種的名稱為從1到n編號M條能量流動關係形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量從物種ai流向物種bi,註意單獨的一種孤立生物 ...
  • 轉載請註明原創出處,謝謝! 因為每個鏈路都會對其性能造成影響,應該是 全鏈路的修改壓測 (ak大神經常說全鏈路!)。本次基本就是區域網,所以並沒有怎麼優化,其實也應該考慮進去的。 Linux系統參數層面的修改: 1. 修改可打開文件數和用戶最多可開發進程數 命令: 可以通過ulimit –a查看參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...