《Python程式設計:從入門到實踐》

莫昭 發表於 2019-08-22

《Python程式設計:從入門到實踐》

C2 變數和簡單資料型別

  • 慎用小寫字母l和大小字母O
  • title() 把每個單詞首字母改成大寫  還有upper lower
  • \n 換行符  \t 製表符(在字串引號裡)
  • strip,rstrip,lstrip() 去掉空格
  • 浮點數問題,3*0.1的執行結果不止兩位小數。
  • 3/2 在python3中執行結果為1.5,但在python2中返回1。
  • 數字+字串會報錯,要強行str(3)

C3 列表介紹

  • exp.append("a")    exp.insert(0,"a")   del exp[0]   exp.pop(0)   exp.remove("a")
  • pop()為空時,預設刪除最末元素。如果要從列表中刪除以後不再用,使用del(),取出來用,使用pop()。remove()只刪除第一個指定的值。
  • exp.sort(reserve=True)按元素大小降序排。sort()對列表永久排序,sorted()臨時排序。reverse()反轉元素排列的順序。

C4 操作列表

  • 從列表中取元素,建議程式碼  for cat in cats:
  • for i in range(1,5) 列印1 2 3 4 不包括5
  • squares=[value**2 for value in range(1,11)]    print(squares) #列表解析式
  • 複製列表:friend_foods=my_foods[:] 這是兩個列表。如果不用[:]操作,則兩個foods仍指向同一列表,改變一個元素,二者都會變。
  • 元組:單個元素不可變,但可以整體賦值。相對於列表,元組是更簡單的資料結構,如果需要儲存的一組值在程式的整個生命週期內都不變,可使用元組。
  • PEP8。建議每級縮排都用4個空格,不要和tab混用。

C5 if語句

requested_toppings=[]

    if requested_toppings: #列表為空時返回False直接執行else語句
        for requested_topping in requested_toppings:
            print("Adding "+ requested_topping +".")
        print("\nFinished making your pizza!")
    else:
        print("Are you sure you want a pizza?")

C6 字典

  • for name in sorted(favorite_)languages.keys())獲取字典元素時,獲取順序是不可預測的,可以用sorted獲取排序副本。還可以用set方法獲取不要重複列表。
  • from collections import OrderedDict #該模組記錄了鍵-值對的新增順序

    遍歷字典

favorite_languages={ 'jen':['python','ruby'], 'sarah':['c'], 'edward':['ruby','go'], 'phil':['python','haskell'] }

for name,languages in favorite_languages.items(): # 還可以keys() values() 不指定時預設遍歷所有鍵 print('\n'+name.title()+"'s favorite languages are:") for language in languages: print('\t'+language.title())

C7 使用者輸入和while迴圈

   #使用使用者輸入來填充字典
    responses={}

    pooling_active=True #設定標誌,指出調查是否繼續

    while pooling_active:
        name=input('\nWhat is your name? ')
        response=input('Which mountain would you like to climb someday? ')

        responses[name]=response #把答案儲存在問卷中

        repeat=input('Would you like to let another person respond?(y/n) ')
        if repeat=='no':
            pooling_active=False #無人時,停止調查

    print('\n---Poll Results---')
    for name,response in responses.items():
        print(name.title()+' would like to climb '+response.title()+'.')

C8 函式

  • 函式使用預設值時,在形參列表中,把有預設值的形參放在最後。這樣Python仍能正確解讀位置形參。

    每個函式值負責一項具體工作。本例中,第一個函式列印每個設計,第二個顯示列印好的模型。

    def print_models(unprinted_designs,completed_models): while unprinted_designs: current_design=unprinted_designs.pop()

        print('Printing model: '+current_design)
        completed_models.append(current_design)
    

    def show_completed_models(completed_models): print('\nThe following models have been printed: ') for completed_model in completed_models: print(completed_model)

    unprinted_designs=['iphone case','robot pendant','dodecahedron'] completed_models=[]

    print_models(unprinted_designs,completed_models) show_completed_models(completed_models)

  • 形參*toppings,將任意數量的實參封裝入元組topping中。形參**userinfo,接受任意數量的關鍵詞實參。

    def build_profile(first,last,**user_info): profile={} profile['first name']=first profile['last name']=last for key,value in user_info.items(): profile[key]=value return profile

    user_profile=build_profile('albert','einstein',location='princeton',field='physics') print(user_profile)

    返回值

    {'first name': 'albert', 'last name': 'einstein', 'location': 'princeton', 'field': 'physics'}

C9 類

  • def __init__(self, name, age):_ #init左右分別2個下劃線,和def間有一個空格。系統自動傳入實參self,它是指向例項本身的引用,讓例項能夠訪問類中的屬性和方法。_

    class Car():

    def __init__(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0 #新增里程表屬性
    
    
    def get_descriptive_name(self):
        long_name=str(self.year)+' '+self.make+' '+self.model
        return long_name.title()
    
    
    def read_odometer(self): #讀取里程錶
        print('This car has '+str(self.odometer_reading)+' miles on it.')
    
    
    def update_odometer(self,mileage): #可手動修改里程錶,防止回撥里程
        if mileage >= self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print('You can\'t roll back an odometer!')
    
    
    def increment_odometer(self,miles): #增加里程值
        self.odometer_reading +=miles
    

    my_used_car=Car('subaru','outback','2013') print(my_used_car.get_descriptive_name())

    my_used_car.update_odometer(23500) my_used_car.read_odometer()

    my_used_car.increment_odometer(100) my_used_car.read_odometer()

    class Battery(): #定義電瓶

    def __init__(self,battery_size=70): #初始化電瓶屬性
        self.battery_size=battery_size
    
    
    def describe_battery(self):  #列印電瓶容量描述資訊
        print('This car has a ' + str(self.battery_size) + '-kWh battery.')
    
    
    def get_range(self):  #定義電瓶續航里程
        if self.battery_size == 70:
            range = 240
        if self.battery_size == 85:
            range = 270
    
    
    
    message = 'This car can go approximately ' + str(range)
    message += ' miles on a full charge.'
    print(message)
    

    class ElectricaCar(Car): #電動車的獨特之處:呼叫電瓶 #建立子類。父類必須在當前檔案中、子類前,括號中制定父類名稱

    def __init__(self,make,model,year):
        super().__init__(make,model,year) #super()呼叫父類的init方法,繼承父類所有屬性
        self.battery=Battery()
    

    my_tesla=ElectricaCar('tesla','models',2016)

    print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery() my_tesla.battery.get_range()

C10 檔案和異常

  • 對於open(), with在不再需要訪問檔案後關閉,比close()更優。
  • open()中可指定'r' 'w' 'a' 'r+'讀取、寫入、附加、讀和寫4種模式。寫入時,會自動建立、或覆蓋原檔案。
  • python中只能讀寫字串,可能需要用str()方法轉換。

    with open('pi_digits.txt') as file_object:
    contents=file_object.read() print(contents.rstrip())

  • try-except-else結構。有時讓使用者看到報錯的traceback是危險的。將可能引發異常的結構放在try裡,如果異常執行except語句。

    print("Give me two numbers, and I'll divide them.") print("Enter 'q' to quit.")

    while True: first_number=input("\nFirst number: ") if first_number=='q': break second_number=input("\nSecond number: ") if second_number=='q': break try: answer=int(first_number)/int(second_number) #將input的str轉為int except ZeroDivisionError: #報錯,但程式繼續執行 print("You can't divide by zero!") else: print(answer)