元組冒泡法及字符串處理

tuple buble string

##元組冒泡法及字符串處理

元組tuple:
  • 不可變對象,有序的序列。
  • 使用()表示
  • 空元組基本沒用,因為不可變
  • 當元組只有一個元素時請用(1,)
In [15]: t=(1,)*5
In [16]: t
Out[16]: (1, 1, 1, 1, 1)
In [18]: id(t)
Out[18]: 275970285904
In [20]: t=t*5
In [21]: t
Out[21]: (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
In [22]: id(t)
Out[22]: 275969422624#通過兩個id的比較證明元組只能重新定義不可修改
In [23]: t=(range(1,7,2))#此處需要注意,()不能正常顯示range函數
In [24]: t
Out[24]: range(1, 7, 2)
In [25]: type(t)
Out[25]: range
In [26]: t=tuple(range(1,7,2))#這樣可以正常顯示想要顯示的range函數
In [27]: t
Out[27]: (1, 3, 5)
元組的訪問
  • 支持索引(下標)
  • 支持正負索引,索引不可以越界,否則引發異常indexerror
  • tuple[index],index就是索引,使用中括號訪問。
元組查詢
  • index(value,[start,[stop]])
    • 通過值value,從指定區間查找列表內的元素是否匹配
    • 匹配到第一個就立即返回索引
    • 匹配不到,拋出異常valueerror
In [31]: t
Out[31]: (1, 3, 5)
In [32]: t.index(3)
Out[32]: 1
In [33]: t.index(3,0,5)#注意end可以指定比最后一個索引大的數值。
Out[33]: 1
In [37]: t.index(4,0,5)
—————————————————————————
ValueError Traceback (most recent call last)
<ipython-input-37-d3ce7b01939a> in <module>()
—-> 1 t.index(4,0,5)
ValueError: tuple.index(x): x not in tuple##此處不是報valueerror,而是提示vlue not in tuple

  • count(value):返回列表中匹配value的次數
In [41]: t
Out[41]: (1, 3, 5)
In [42]: t.count(3)
Out[42]: 1
In [43]: t.count(4)
Out[43]: 0#匹配不到顯示零,不會報錯
  • 時間復雜度:index和count都是O(n),隨著元組元素的規模的增大,而效率下降。
  • len(tuple):返回元素的個數
  • 元組是只讀的,所以增刪改方法都沒有??梢岳斫獬蓹嘞薷偷牧斜?。
  • 元組節約內存,比列表
  • 目的:不讓其他人改變元素,可當做只讀列表
  • 引用類型可以變,相當于換了一件衣服:例如:t=(1,[2,3],4):此處23可以修改

命名元組namedtuple
  • 目的:如果tuple中的元素很多的時候操作起來就比較麻煩,有可能會由于索引錯誤導致出錯。namedtuple對象就如它的名字說定義的那樣,你可以給tuple命名。
  • namedtuple方法在collections方法集中,所以使用需要from collections import namedtuple
  • namedtuple(typename,field_names,verbose=False,rename=False)
    • 命名元組,返回一個元組的子類,并定義了字段
    • field_names可以是空格或逗號分割的字段的字符串,可以是字段的列表
In [50]: from collections import namedtuple
In [51]: Point=namedtuple(‘_Point’,[‘x’,’y’])
In [52]: p=Point(4,5)
In [53]: p.x+p.y
Out[53]: 9
In [55]: P=namedtuple(‘a’,[‘x’,’z’])#此處的a是field_names,必須是字符形式的非數字
In [56]: p
Out[56]: _Point(x=4, y=5)
In [57]: P
Out[57]: __main__.a
In [58]: c=P(4,5)
In [59]: cx
In [70]: d=namedtuple(1,[‘x’,’y’])#此處證明field_names不可以是數字,加上引號也不可以
—————————————————————————
NameError Traceback (most recent call last)
<ipython-input-59-c2e08fa19a2c> in <module>()
—-> 1 cx
NameError: name ‘cx’ is not defined#調用方法出錯
In [60]: c.x
Out[60]: 4
In [67]: d=namedtuple(‘0’,[‘x’,’y’])
—————————————————————————
ValueError Traceback (most recent call last)
<ipython-input-67-5f18d65cc1d7> in <module>()
—-> 1 d=namedtuple(‘0’,[‘x’,’y’])
c:\users\devops\appdata\local\programs\python\python35\lib\collections\__init__.py in namedtuple(typename, field_names, verbose, rename)
401 if not name.isidentifier():
402 raise ValueError(‘Type names and field names must be valid ‘
–> 403 ‘identifiers: %r’ % name)
404 if _iskeyword(name):
405 raise ValueError(‘Type names and field names cannot be a ‘
ValueError: Type names and field names must be valid identifiers: ‘0’
[使用舉例]
In [72]: Student=namedtuple(‘Student’,’name age’)
In [74]: tom=Student(‘Thunk’,29)#實例化對象
In [75]: tom.name#用名稱調用value
Out[75]: ‘Thunk’
In [76]: tom.age
Out[76]: 29

練習:
  • 依次接受用戶輸入的3個數,排序后打印:
    • 轉換int后,判斷大小排序
    • 使用max函數
    • 使用列表的sort方法
    • 冒泡法

冒泡法
  • 屬于交換排序
  • 兩兩比較大小,交換位置。如同水泡咕嘟咕嘟往上冒
  • 結果分為升序和降序排列
  • 升序:
    • n個數從左至右,編號從0開始到n-1,索引0和1的值比較,如果索引0大,則交換兩者的位置,如果索引1大,則不交換。繼續比較索引1和2的值,將大值放在右側。直至n-2和n-1比較完,第一輪比較完成。第二輪從索引0比較到n-2,因為最右側n-1的位置上已經是最大值了,依次類推,每輪都會減少最右側的不參與比較,直至剩下最后兩個數比較。
  • 時間復雜度為O(n2)
num_list=[[1,9,8,5,6,7,4,3,2],[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,9,8]]
nums=num_list[2]
print(nums)
length=len(nums)
count_swap=0
count=0
for i in range(length):
flag=False#每次循環初始化標簽
for j in range(length-i-1):
count += 1
if nums[j] > nums[j+1]:
tmp=nums[j]
nums[j]=nums[j+1]
nums[j+1]=tmp
flag=True#此處如果修改下面的if語句永遠不會執行
count_swap += 1
if not flag:
break
print(nums,count_swap,count)

字符串
  • 一個個字符組成有序的序列,是字符的集合
  • 使用單引號,雙引號,三引號引住的字符序列
  • 字符串是不可變對象
  • Python3開始,字符串就是Unicode類型
  • 使用r/R將字符串中的特殊字符原樣輸出
    舉例:
In [1]: s3=”’this’s a “string””’
In [3]: s3
Out[3]: ‘this\’s a “string”‘#####################`為什么自動加轉義符??`
In [4]: s4=’hello \n magedu.com’
In [5]: s4
Out[5]: ‘hello \n magedu.com’
In [6]: s5=r’this \n Thunk lee’
In [7]: s5
Out[7]: ‘this \\n Thunk lee’
In [8]: print(s4)#此處證明在無r的情況下特殊字符具有特殊功效
hello
magedu.com
In [9]: print(s5)#在加有r的情況下,特殊字符串也是原樣輸出
this \n Thunk lee
In [10]: sql=”””select * from user where name=’tom'”””#三引號內可以使用單雙引號
In [11]: print(sql)
select * from user where name=’tom’
字符串訪問
  • 下標:字符串支持索引訪問
  • 有序的字符集合,字符序列
  • 可迭代
字符串join連接
  • “指定分隔符”.join(iterable),用來連接字符串,其他類型不可以。
  • 可迭代對象內部必須是簡單類型,復雜類型無法執行
    舉例:
In [50]: “@”.join(“abcdefg”)##使用方法小括號內必須是可迭代對象,分隔符無所謂
Out[50]: ‘a@b@c@d@e@f@g’
In [51]: lst=[‘1’,[‘3′,’4′],’8’]##復雜類型無法處理
In [52]: “#”.join(lst)
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-52-fa3d037801ad> in <module>()
—-> 1 “#”.join(lst)
TypeError: sequence item 1: expected str instance, list found
In [53]: lst=[‘1′,’4′,’8’]##簡單類型正常處理
In [54]: “#”.join(lst)
Out[54]: ‘1#4#8’
In [56]: print(“\n”.join(lst))#使用換行符作為分隔符
1
4
8
In [57]: print(“\””.join(lst))#雙引號作為分隔符
1″4″8
##疑問?lst=[1,2,3,4]是否可以用join,結果如下
In [1]: lst = [1,2,3,4]
In [2]: “#”.join(lst)
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-2-fa3d037801ad> in <module>()
—-> 1 “#”.join(lst)
TypeError: sequence item 0: expected str instance, int found
In [3]: lst1=[“1″,”abc”,”345″]
In [4]: “#”.join(lst1)
Out[4]: ‘1#abc#345’
字符串連接
  • +:將兩個字符串連接在一起,返回一先得字符串
In [58]: a=”abcdefg”
In [59]: b=”hijklmn”
In [60]: a+b
Out[60]: ‘abcdefghijklmn’
字符串分割
  • 1.split:將字符串按照分隔符分割成若干字符串,并返回列表
    • split(sep=None,maxsplit=-1)
      • 從左至右
      • sep指定分割字符串,缺省的情況下空白字符串作為分隔符
      • maxsplit指定分割次數,-1表示遍歷整個字符串
    • rsplit:從右向左
    • splitlines([keepends])
      • 按照行來切分字符串
      • keepends指的是是否保留行分隔符
      • 行分隔符包括\n,\r\n,\r等
##split舉例:
In [63]: s1=”I’m \ta super student”
In [64]: s1.split(sep=”,”)#由于沒有此符號所以無法分割,注意必須拿元素中有的元素來分割
Out[64]: [“I’m \ta super student”]
In [65]: s1.split()#默認空格分隔‘ ’+
Out[65]: [“I’m”, ‘a’, ‘super’, ‘student’]
In [66]: s1.split(‘s’)#指定用s字符分割
Out[66]: [“I’m \ta “, ‘uper ‘, ‘tudent’]
In [67]: s1.split(“super”)#指定super來分割
Out[67]: [“I’m \ta “, ‘ student’]
##rsplit舉例:
In [69]: s1.rsplit(“\t”,maxsplit=2)
Out[69]: [“I’m “, ‘a super student’]
In [70]: s1.rsplit(“s”,maxsplit=1)#此例子可以用于取路徑中的文件名
Out[70]: [“I’m \ta super “, ‘tudent’]
In [71]: s=”/etc/sysconfig/network-scripts/ifcf-ens33″
In [72]: s
Out[72]: ‘/etc/sysconfig/network-scripts/ifcf-ens33’
In [73]: s.rsplit(“/”,1)
Out[73]: [‘/etc/sysconfig/network-scripts’, ‘ifcf-ens33’]
In [74]: list(s.rsplit(“/”,1))[1]
Out[74]: ‘ifcf-ens33’
  • 2.partition:將字符串按照分隔符分割成兩段,返回這兩段和分割符的tuple
  • partition(seq)
    • 從左至右,遇到分隔符就把字符串分割成兩部分,返回頭、分隔符、尾三部分的三元組;如果沒有找到分隔符,就返回頭、2個空元素的三元組
    • seq分割字符串,必須制定
  • rpartition(seq):從右至左,如果沒找到分割符就返回兩個空元素和尾的三元組
In [94]: s1.partition(“\n”)#此函數又叫一刀兩段
Out[94]: (“i’m a super student.”, ‘\n’, “you’re a super teacher.”)
In [95]: s1.partition(“s”)
Out[95]: (“i’m a “, ‘s’, “uper student.\nyou’re a super teacher.”)
In [96]: s1.rpartition(“s”)#從右開始切
Out[96]: (“i’m a super student.\nyou’re a “, ‘s’, ‘uper teacher.’)
In [97]: s1.partition(“x”)#不存在的分隔符會用空元素補全
Out[97]: (“i’m a super student.\nyou’re a super teacher.”, ”, ”)
In [98]: s1.rpartition(“x”)
Out[98]: (”, ”, “i’m a super student.\nyou’re a super teacher.”)
In [99]: s1.rpartition(“”)#不指定分隔符則報錯
—————————————————————————
ValueError Traceback (most recent call last)
<ipython-input-99-9151ec630fbe> in <module>()
—-> 1 s1.rpartition(“”)
ValueError: empty separator
字符串大小寫
  • upper()全大寫
  • lower()全小寫
  • swapcase()互換大小寫
In [106]: a.upper()#這些方法是字符串下的方法,所以需要用str.upper()來調用
Out[106]: ‘ABCDEF’
In [107]: a.lower()
Out[107]: ‘abcdef’
In [108]: a.swapcase
Out[108]: <function str.swapcase>
In [109]: a.swapcase()
Out[109]: ‘AbcDef’
字符串修改
  • replace(old,new[,count]):
    • 字符串中找到匹配替換為新字串,返回新字符串
    • count表示替換幾次,不指定默認全部替換
In [113]: a=’asdlkfjiefjoefjjjjjj’
In [114]: a.replace(‘j’,’#’)
Out[114]: ‘asdlkf#ief#oef######’
In [115]: a.replace(‘j’,’#’,2)
Out[115]: ‘asdlkf#ief#oefjjjjjj’
  • strip([chars])
    • 從字符串兩端去除制定的字符集chars中的所有字符默認兩段開始,如果從某一端開始可能會影響結果
    • 如果沒指定chars,默認去除端的空白字符
    • lstrip([chars]):從左開始
    • rstrip([chars]):從右開始
1.In [116]: s=’\r \n \t Hello Python \n \t’
2.In [117]: s
3.Out[117]: ‘\r \n \t Hello Python \n \t’
4.In [118]: s.strip()##默認去除空白字符
5.Out[118]: ‘Hello Python’
6.
7.In [119]: s1=”I am very very very sorry”
8.In [121]: s1.strip(“vy”)
9.Out[121]: ‘I am very very very sorr’
10.In [122]: s1
11.Out[122]: ‘I am very very very sorry’
12.In [123]: s1.strip(“v”)
13.Out[123]: ‘I am very very very sorry’
14.In [124]: s1.strip(“I”)
15.Out[124]: ‘ am very very very sorry’
16.In [125]: s1.strip(“Iry”)
17.Out[125]: ‘ am very very very so’#只要兩端匹配到就刪除
18.
19.#lstrip,rstrip舉例:
20.In [127]: s=”I am very very very sorry “
21.In [128]: s.strip(“Iy “)#兩端開始
22.Out[128]: ‘am very very very sorr’
23.In [129]: s.lstrip(‘Iy ‘)#左開始
24.Out[129]: ‘am very very very sorry ‘
25.In [130]: s.rstrip(‘Iy ‘)#右開始
26.Out[130]: ‘I am very very very sorr’
字符串查找
  • find(sub[,start[,end]]) –>int
    • 在指定區間內[start,end),從左到右查找子串sub。找到返回索引,沒找到返回-1
    • rfind(sub[,start[,end]]):從右往左查
In [131]: a
Out[131]: ‘asdlkfjiefjoefjjjjjj’
In [134]: a.find(“j”,0,100)
Out[134]: 6
In [135]: a[6]
Out[135]: ‘j’
In [136]: a.rfind(“j”,0,100)#從右往左找到第一個sub返回index,區間可以為負索引
Out[136]: 19
In [137]: len(a)
Out[137]: 20
In [138]: a.rfind(“x”,0,100)#沒找到元素返回-1
Out[138]: -1

  • index(sub[,start[,end]])—>int跟find區別:拋出異常與否.具體使用方法相同
    • 在指定區間內[start,end),從左到右,查找子串sub,找到返回索引,沒找到拋出異常valueerror
    • rindex(sub[,start[,end]]),從右到左
In [138]: a.rfind(“x”,0,100)#返回-1
Out[138]: -1
In [139]: a.index(“x”,0,100)#拋出value異常
—————————————————————————
ValueError Traceback (most recent call last)
<ipython-input-139-88e7d48786fe> in <module>()
—-> 1 a.index(“x”,0,100)
ValueError: substring not found
字符串判斷
  • endswith(suffix[,start[,end]])–>bool
    • 在指定區間[start,end),字符串是否是suffix結尾
  • startswith(prefix,[,start[,end]])–>bool
    • 在指定區間xxx,字符串是否已prefix結尾
In [183]: s
Out[183]: ‘I am very very very sorry’#string集合
In [184]: s.startswith(“very”)
Out[184]: False
In [185]: s.startswith(“very”,5)
Out[185]: True
In [186]: s.startswith(“very”,5,9)
Out[186]: True
In [187]: s.endswith(“very”,5,9)
Out[187]: True
In [188]: s.endswith(“sorry”,5)
Out[188]: True
In [189]: s.endswith(“sorry”,5,-1)#無法取到-1,因為是開區間
Out[189]: False
In [190]: s.endswith(“sorr”,5,-1)#去掉y可以證明-1導致的false
Out[190]: True
In [191]: s.endswith(“sorry”,5,100)
Out[191]: True
字符串判斷is系列
  • isalnum()–>bool是否是字母和數字組成
  • isalpha():是否是字母
  • isdecimal()是否只包含十進制數字
  • isdigit()是否全部數字(0-9)
  • isidentifier()是不是字母和下劃線開頭,其他都是字母數字,下劃線
  • islower()是否都是小寫
  • isupper()是否都是大寫
  • isspace()是否只包含空白字符
In [197]: s=”5″
In [198]: s.isdigit()
Out[198]: True#返回布爾值
In [199]: if s.isdigit():#字符串集合才可以使用
…: print(“Is number”)
Is number
字符串格式化
  • 字符串的格式化是一種拼接字符串輸出樣式的手段,更方便靈活
    • join拼接只能使用分隔符,且要求被拼接的是可迭代對象
    • +拼接字符串還算方便,但是非字符串需要先轉換成字符串才能拼接
  • format函數格式字符串語法
    • “{} {xxx}”.format(*args,**kwargs)–>str
    • args是位置參數,是一個元組
    • kwargs是關鍵字參數,是一個字典
    • 花括號表示占位符
    • {}表示按照順序匹配位置參數,{n}表示取位置參數索引為n的值
    • {xxxx}表示在關鍵字參數中搜索名稱一致的
    • {{}}表示打印花括號
##用法舉例:
#位置參數:
In [216]: “{}:{}”.format(‘192.168.0.1’,9999)
Out[216]: ‘192.168.0.1:9999’
#關鍵參數:
In [218]: “{server}:{}:{}”.format(“192.168.0.1″,8888,server=”app”)
Out[218]: ‘app:192.168.0.1:8888’
#訪問元素:
In [223]: “{0[0]},{1[1]}”.format(“magedu”,”com”)
Out[223]: ‘m,o’
In [224]: “{0[0]},{1[2]}”.format(“magedu”,”com”)
Out[224]: ‘m,m’
In [225]: “{0},{1}”.format(“magedu”,”com”)
Out[225]: ‘magedu,com’
#對象屬性訪問
In [226]: from collections import namedtuple
In [227]: P=namedtuple(“P”,”x y”)
In [228]: p=P(4,5)
In [232]: “{}{}”.format(p.x,p.y)
Out[232]: ’45’
In [233]: “{0.x}{0.y}”.format(p)
Out[233]: ’45’
  • 對齊:
In [234]: ‘{0}*{1}={2:<2}’.format(2,3,2*3)#左對齊
Out[234]: ‘2*3=6 ‘
In [235]: ‘{0}*{1}={2:<02}’.format(2,3,2*3)
Out[235]: ‘2*3=60’
In [236]: ‘{0}*{1}={2:<02}’.format(2,3,2*3)
Out[236]: ‘2*3=60’
In [237]: ‘{0}*{1}={2:>02}’.format(2,3,2*3)
Out[237]: ‘2*3=06’
In [238]: ‘{:^30}’.format(“centered”)
Out[238]: ‘ centered ‘
In [239]: ‘{:*^30}’.format(“centered”)
Out[239]: ‘***********centered***********’
  • 進制:
In [240]: “int:{0:d}; hex:{0:x};oct:{0:n};bin:{0:b}”.format(43)
Out[240]: ‘int:43; hex:2b;oct:43;bin:101011’
In [241]: “int:{0:d}; hex:{0:#x};oct:{0:#n};bin:{0:#b}”.format(43)
Out[241]: ‘int:43; hex:0x2b;oct:43;bin:0b101011’
In [242]: octets=[192,168,0,1]
In [243]: ‘{:02X}{:02X}{:02X}{:02X}’.format(*octets)
Out[243]: ‘C0A80001’

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87485

(0)
Thunk_LeeThunk_Lee
上一篇 2017-09-23 15:11
下一篇 2017-09-23

相關推薦

  • enumerate用法和轉置矩陣求解、效率測試

    enumerate用法和轉置矩陣求解、效率測試

    2018-04-08
  • Python的安裝

    安裝Python 3還是2目前,Python有兩個版本,一個是2.x版,一個是3.x版,這兩個版本是不兼容的。由于3.x版越來越普及,3中的特性越來越要求企業用3來開發,所以更加推薦python3作為安裝學習的版本??梢栽谀男┎僮飨到y下安裝python安裝Python的平臺因為Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Uni…

    2017-09-18
  • Python模擬java的do while循環

    在java中有這樣的語句: do{    //dosomething}while(條件A); 在python中沒有do-while這樣的語法,這也是python中“解決一個問題最好只有一個方法”的體現,那么python中怎么模擬do-while語句呢?可以這樣: while True:  &nbsp…

    Python干貨 2015-03-08
  • StringIO

    StringIOio模塊中的類From io import StringIO內存中,開辟的一個文本模式的buffer,可以像文件對象一樣操作它當close方法被調用的時候,這個buffer會被釋放StringIO操作getvalue() 獲取全部內容。跟文件指針沒有關系from io import StringIO# 內存中構建sio = StringIO(…

    Python筆記 2018-05-07
  • Python基礎練習之set/dict練習

    1.用戶輸入一個數字 打印每一位數字及其重復的次數 (1)字符串練習2用的方法 while True: num = input().strip().lstrip(‘0’) if num.isdigit(): break count = [0] * 10 for j in num: x = int(j) if count[x] == 0: count[x] =…

    2017-10-09
  • Python爬蟲實戰七之計算大學本學期績點

    大家好,本次為大家帶來的項目是計算大學本學期績點。首先說明的是,博主來自山東大學,有屬于個人的學生成績管理系統,需要學號密碼才可以登錄,不過可能廣大讀者沒有這個學號密碼,不能實際進行操作,所以最主要的還是獲取它的原理。最主要的是了解cookie的相關操作。 本篇目標 1.模擬登錄學生成績管理系統 2.抓取本學期成績界面 3.計算打印本學期成績 1.URL的獲…

    2017-09-09
欧美性久久久久