簡單直接上字符串的使用代def main():python
str1 = 'hello, world!' # 經過len函數計算字符串的長度 print(len(str1)) # 13 # 得到字符串首字母大寫的拷貝 print(str1.capitalize()) # Hello, world! # 得到字符串變大寫後的拷貝 print(str1.upper()) # HELLO, WORLD! # 從字符串中查找子串所在位置 print(str1.find('or')) # 8 print(str1.find('shit')) # -1 # 與find相似但找不到子串時會引起異常 # print(str1.index('or')) # print(str1.index('shit')) # 檢查字符串是否以指定的字符串開頭 print(str1.startswith('He')) # False print(str1.startswith('hel')) # True # 檢查字符串是否以指定的字符串結尾 print(str1.endswith('!')) # True # 將字符串以指定的寬度居中並在兩側填充指定的字符 print(str1.center(50, '*')) # 將字符串以指定的寬度靠右放置左側填充指定的字符 print(str1.rjust(50, ' ')) str2 = 'abc123456' # 從字符串中取出指定位置的字符(下標運算) print(str2[2]) # c
*** # 字符串切片(從指定的開始索引到指定的結束索引) print(str2[2:5]) # c12 print(str2[2:]) # c123456 print(str2[2::2]) # c246 print(str2[::2]) # ac246 print(str2[::-1]) # 654321cba print(str2[-3:-1]) # 45 # 檢查字符串是否由數字構成 print(str2.isdigit()) # False # 檢查字符串是否以字母構成 print(str2.isalpha()) # False # 檢查字符串是否以數字和字母構成 print(str2.isalnum()) # True str3 = ' jackfrued@126.com ' print(str3) # 得到字符串修剪左右兩側空格的拷貝 print(str3.strip()) if __name__ == '__main__': main()
練習:生成指定位數的驗證碼(數字,大小寫字母組成的):2種寫法,第一種要根據數字和大小寫字母的ASCII來計算隨機數的生成;第二種方法利用字符串的切片來完成。另外還要學習第二種中的文本註釋寫法。git
import random def getcode(): x = eval(input("你要幾位驗證碼")) y = "" for i in range(x): r = random.randint(0, 74) while not(0 < r < 10 or 16 < r < 43 or 48 < r < 74): r = random.randint(0, 74) y = chr(ord('0') + r) + y print(y) if __name__ == '__main__': getcode()
import random def generate_code(code_len=4): ''' 生成指定長度的驗證碼 :param code_len: 驗證碼的長度 :return: 由大小寫字母和數字構成的隨機驗證碼 ''' all_chars = '0123456789abcdefghijklmnopqrstuvwxyzASDFGHJKLMNBVCXZQWERTYUIOP' last_pos = len(all_chars) - 1 code = '' for _ in range(code_len): index = random.randint(0, last_pos) code += all_chars[index] return code
列表能夠存儲一個有序的元素集合,其大小是可變的,咱們可使用循環對容器中的額保存的數據進行操做。列表的下標都是從0開始的。api
列表的建立安全
list1 = list([1, 2, 3])
list2 = [1, 3 ,5]
咱們還能夠利用列表的生成式和生成器來建立列表,以下:app
import sys def main(): f = [x for x in range(1, 10)] print(f) f = [x + y for x in 'ABCDE' for y in '1234567'] print(f) # 用列表的生成表達式語法建立列表容器 # 用這種語法建立列表以後元素已經準備就緒因此須要耗費較多的內存空間 f = [x ** 2 for x in range(1, 1000)] print(sys.getsizeof(f)) # 查看對象佔用內存的字節數 print(f) # 請注意下面的代碼建立的不是一個列表而是一個生成器對象 # 經過生成器能夠獲取到數據但它不佔用額外的空間存儲數據 # 每次須要數據的時候就經過內部的運算獲得數據(須要花費額外的時間) f = (x ** 2 for x in range(1, 1000)) print(sys.getsizeof(f)) # 相比生成式,生成器不佔用存儲數據的空間 print(f) #<generator object main.<locals>.<genexpr> at 0x00426C60> for val in f: #須要數據就要遍歷循環 print(val) if __name__ == '__main__': main()
Python裏面還有另一種定義生成器的方式,經過yield關鍵字將一個普通函數改形成生成器函數,如下用遞歸方法來定義計算斐波拉契數列:Fn = Fn-1 + Fn-2(n>2)dom
def fib(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b yield a def main(): for val in fib(20): print(val) if __name__ == '__main__': main()
元組簡單理解就是把多個不一樣的元素組合到一塊兒,它和列表同樣能夠保存多條數據,可是元組中的元素不能修改。函數
def main(): # 定義元組 t = ('橘子', 6, True, '丹棱') print(t) # 獲取元組中的元素 print(t[0]) print(t[3]) # 遍歷元組中的值 for member in t: print(member) # 從新給元組賦值 # t[0] = '蘋果' # TypeError # 變量t從新引用了新的元組原來的元組將被垃圾回收 t = ('橙子’', 6, True, '丹棱') print(t) # 將元組轉換成列表 fruit = list(t) print(fruit是能夠修改它的元素的 fruit[0] = '香蕉' fruit[1] = 25 print(fruit) # 將列表轉換成元組 fruits_list = ['apple', 'banana', 'orange'] fruits_tuple = tuple(fruits_list) print(fruits_tuple) if __name__ == '__main__': main()
爲何在有列表的狀況下,還會須要元組類型呢?學習
答:一、元組中的元素是沒法修改的,那麼一個不變的對象要比可變的對象更加容易維護;另外一方面由於沒有任何一個線程可以修改不變對象的內部狀態,一個不變對象自動就是線程安全的,這樣就能夠省掉處理同步化的開銷。一個不變對象能夠方便的被共享訪問。所以若是不須要對元素進行添加、刪除、修改的時候,能夠考慮使用元組,固然若是一個方法要返回多個值,使用元組也是不錯的選擇。二、元組在建立時間和佔用的空間上面都優於列表。ui
python語言中的集合和數學上的集合是一致的,不容許有重複元素,並且能夠進行交集,並集,差集等運算。spa
def main(): set1 = {1, 2, 3, 3, 3, 2} print(set1) print('Length =', len(set1)) set2 = set(range(1, 10)) print(set2) set1.add(4) set1.add(5) set2.update([11, 12]) print(set1) print(set2) set2.discard(5) # remove的元素若是不存在會引起KeyError if 4 in set2: set2.remove(4) print(set2) # 遍歷集合容器 for elem in set2: print(elem ** 2, end=' ') print() # 將元組轉換成集合 set3 = set((1, 2, 3, 3, 2, 1)) print(set3.pop()) print(set3) # 集合的交集、並集、差集、對稱差運算 print(set1 & set2) # print(set1.intersection(set2)) print(set1 | set2) # print(set1.union(set2)) print(set1 - set2) # print(set1.difference(set2)) print(set1 ^ set2) # print(set1.symmetric_difference(set2)) # 判斷子集和超集 print(set2 <= set1) # print(set2.issubset(set1)) print(set3 <= set1) # print(set3.issubset(set1)) print(set1 >= set2) # print(set1.issuperset(set2)) print(set1 >= set3) # print(set1.issuperset(set3)) if __name__ == '__main__': main()
形如咱們常使用的字典,python裏面的字典也是一種可變容器模型,但與列表、集合不一樣的是,字典的每一個元素都是由鍵值對(一個鍵和一個值組成的),鍵和值經過:分開,以下:
def main(): dict1 = {'name': '狗', 'age': 5, 'gender': True,'motto':'hello'} print(dict1['name']) #狗 print(dict1['age']) #5 dict1['name'] = '貓' # 把字典裏的狗改爲貓 print(dict1) print(dict1.pop('age')) #刪除‘age’:5 print(dict1.popitem()) #打印刪除最後的鍵值對 print(dict1) del dict1['name'] #刪除name鍵值對 dict1.update(height = 178, fav = ['吃','玩'])#增長鍵值對 dict1.setdefault('motto','hhgh') if 'motto' in dict1: print(dict1['motto']) print(dict1) for i in dict1: print(i, '--->', dict1[i]) if __name__ == '__main__': main()
練習題1:
輸入5個學生的三門成績打印成表格形式
def main(): names = ['關羽', '張飛', '趙雲', '馬超', '貂蟬'] subjects = ['語文','數學','python'] table = [[0 for _ in range(3)] for _ in range(len(names))] #table = [[0]*len(subjects) for _ in range(len(names))]這種能夠,用生成式 print(id(table[0])) print(id(table[1])) #scores = [[0] * len(subjects)] * len(names)這是錯誤的,複製的5個都是同一地址 for row, name in enumerate(names): print('請輸入%s的成績:' % name) for col, subject in enumerate(subjects): score = input('%s:' % subject) table[row][col] = score print(table) if __name__ == '__main__': main()
小結:#scores = [[0] * len(subjects)] * len(names)這是錯誤的,複製的5個列表都是同一地址,後面計算複製總會覆蓋以前的,所以最後結果全是最後一名學生的成績。
練習2
設計一個函數傳入年月日返回這一天是這一年的第幾天
def which_day(year, month, date): list1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] days = 0 for i in range(month-1): days += list1[i] days = days + date if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: if month > 2: days = days + 1 return days if __name__ == '__main__': print(which_day(2016, 3, 1))
def which_day1(year, month, date): #把平年和閏年放在列表[0],[1]中,Ture 返回1 ,Flase 返回0 days_of_month = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]][is_leap_year(year)] total = 0 for i in range(month - 1): total += days_of_month[i] return total + date if __name__ == '__main__':
print(which_day1(2016, 3, 1))
小結:一、儘可能不要再函數中設置print,而用return來返回。二、能夠把判斷閏年的單獨定義爲一個函數。
練習3:模擬下注雙色球
from random import randrange, randint def display(select): for index, balls in enumerate(select): if index == len(select)-1: print('丨', end='') print('%02d' % balls, end=' ') ##格式化用0來補位 print() def random_select(): red_balls = list(range(1,34)) selected_balls = [] for _ in range(6): index = randrange(len(red_balls)) selected_balls.append(red_balls[index]) del red_balls[index] selected_balls.sort() selected_balls.append(randint(1,16)) return selected_balls def main(): n = int(input('機選幾注')) for _ in range(n): display(random_select()) if __name__ == '__main__': main()
練習4:約瑟夫環
''' 《幸運的基督徒》 有15個基督徒和15個非基督徒在海上遇險,爲了能讓一部分人活下來不得不將其中15我的扔到海里面去, 有我的想了個辦法就是你們圍成一個圈,由某我的開始從1報數,報到9的人就扔到海里面, 他後面的人接着從1開始報數,報到9的人繼續扔到海里面,直到扔掉15我的。 因爲上帝的保佑,15個基督徒都倖免於難,問這些人最開始是怎麼站的,哪些位置是基督徒哪些位置是非基督徒。 ''' def huan (): person = [True] * 30 count = 0 num = 0 i = 0 while count < 15 : if person[i] == True: num += 1 if num == 9: person[i] = False num = 0 count += 1 i += 1 i = i % 30 for x in person: print('基' if x else '非',end=' ') if __name__ == '__main__': huan()
小結:用布爾類型來表示人的死活,注意這是個圓。
練習5
打印出楊輝三角
def main(): num = int(input('Number of rows: ')) yh = [[]] * num for row in range(len(yh)): yh[row] = [None] * (row + 1) for col in range(len(yh[row])): if col == 0 or col == row: yh[row][col] = 1 else: yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1] print(yh[row][col], end='\t') print() if __name__ == '__main__': main()