1. 程式人生 > 實用技巧 >《30天自制作業系統》軟盤 -> VMware虛擬機器

《30天自制作業系統》軟盤 -> VMware虛擬機器

  1. from modname import *

    這一句裡的星號應該是沿用自正則中一樣的意義,表示的是全部的意思,文中指出少用這種匯入方式,我覺得是如果將一個模組的所有函式名匯入當前名稱空間中,如果不同模組包含了函式名相同的函式,或者是與自己編寫得函式名相同將會導致混亂,而且在 debug 時還不容易發現。

  2. 在需要匯入包中所有模組時,import* 還是有意義的。

    只需要在 __init__.py 檔案裡面將所有模組名定義在列表 __ALL__ 中就能解決你最後的擔憂。

  3. from modname import *

    這種方式進行匯入,如果不同模組之間有相同的函式命名,最後匯入的會覆蓋前面的,也就是說只會呼叫到最後匯入進的函式。

  4. 關於匯入模組,自己寫的程式,自己也可以把它儲存下來,以後需要的時候匯入使用,例如下面所示。

    我有個程式碼名稱為 test1.py,它的所在路徑為 D:\test 下面。那我只需要完成以下步驟就可以把它作為模組 import 到其他程式碼中了。

    • 1.import sys
    • 2.sys.path.append("D:\\test")

    在 test2.py 中我們就可以直接 import test1.py 了。成功匯入後,test1中 的方法也就可以在 test2 中進行使用。

    import test1
    1. python檔案寫入也可以進行網站爬蟲,我的python版本是3.6,以下程式碼是開啟project.txt檔案,並向裡面寫入http://www.baidu.com網站程式碼。

      from urllib import request
      
      response = request.urlopen("http://www.baidu.com/")  # 開啟網站
      fi = open("project.txt", 'w')                        # open一個txt檔案
      page = fi.write(str(response.read()))                # 網站程式碼寫入
      fi.close()                                           # 關閉txt檔案
    2. input() 預設輸入的為 str 格式,若用數學計算,則需要轉換格式,例:

      a=input('請輸入數字:')
      print(a*2)

      假設輸入數值為3,則上例中得出結果為:

      33

      若將程式碼修改為:

      a=int(input('請輸入數字:'))
      print(a*2)

      則結果為:

      6
    3. 通過 pickle 序列化實現一個簡單聯絡人資訊管理:

      import pickle
      import os
      
      datafile = 'person.data'
      line = '======================================='
      message = '''
      =======================================
      Welcome bookmark:
          press 1 to show list
          press 2 to add pepole
          press 3 to edit pepole
          press 4 to delete pepole
          press 5 to search pepole
          press 6 to show menu
          press 0 to quit
      =======================================
      '''
      print(message)
      
      class Person(object):
          """通訊錄聯絡人"""
          def __init__(self, name, number):
              self.name = name
              self.number = number
      
      # 獲取資料
      def get_data(filename=datafile):
          # 檔案存在且不為空
          if os.path.exists(filename) and os.path.getsize(filename):
              with open(filename,'rb') as f:
                  return pickle.load(f)
          return None
              
      # 寫入資料
      def set_data(name, number, filename=datafile):
      
          personList = {} if get_data() == None else get_data()
      
          with open(filename,'wb') as f:
              personList[name] = Person(name,number)
              pickle.dump(personList,f)
      
      # 儲存字典格式的資料到檔案
      def save_data(dictPerson, filename=datafile):
          with open(filename,'wb') as f:
              pickle.dump(dictPerson,f)
      
      # 顯示所有聯絡人
      def show_all():
          personList = get_data()
          if personList:
              for v in personList.values():
                  print(v.name,v.number)
              print(line)
          else:
              print('not yet person,please add person')
              print(line)
      
      # 新增聯絡人
      def add_person(name,number):
          set_data(name,number)
          print('success add person')
          print(line)
      
      # 編輯聯絡人
      def edit_person(name,number):
          personList = get_data()
          if personList:
              personList[name] = Person(name,number)
              save_data(personList)
              print('success edit person')
              print(line)
      
      # 刪除聯絡人
      def delete_person(name):
          personList = get_data()
          if personList:
              if name in personList:
                  del personList[name]
                  save_data(personList)
                  print('success delete person')
              else:
                  print(name,' is not exists in dict')
              print(line)
      
      
      # 搜尋聯絡人
      def search_person(name):
          personList = get_data()
          if personList:
              if name in personList.keys():
                  print(personList.get(name).name, personList.get(name).number)
              else:
                  print('No this person of ',name)
              print(line)
              
      
      while True:
          num = input('>>')
      
          if num == '1':
              print('show all personList:')
              show_all()
          elif num == '2':
              print('add person:')    
              name = input('input name>>')
              number = input('input number>>')
              add_person(name,number)
          elif num == '3':
              print('edit person:')
              name = input('input name>>')
              number = input('input number>>')
              edit_person(name,number)elif num =='4':print('delete person:')
              name = input('input name>>')
              delete_person(name)elif num =='5':print('search :')
              name = input('input name>>')
              search_person(name)elif num =='6':print(message)elif num =='0':breakelse:print('input error, please retry'
    4. 格式化輸出

      1、整數的輸出

      語法說明

      格式化符號格式說明備註 %o 八進位制 oct%d 十進位制 dec%x 十六進位制 hex。

      舉個栗子

      print('%o' % 20) # 八進位制24
      print('%d' % 20) # 十進位制20
      print('%x' % 24) # 十六進位制18

      2、浮點數輸出

      語法說明

      格式化符號說明備註 %f 保留小數點後面六位有效數字 float%e 保留小數點後面六位有效數字 %g 在保證六位有效數字的前提下,使用小數方式,否則使用科學計數法。

      舉個栗子:

      print('%f' % 1.11)         # 預設保留6位小數1.110000
      print('%.1f' % 1.11)       # 取1位小數1.1
      print('%e' % 1.11)         # 預設6位小數,用科學計數法1.110000e+00
      print('%.3e' % 1.11)       # 取3位小數,用科學計數法1.110e+00
      print('%g' % 1111.1111)    # 預設6位有效數字1111.11
      print('%.7g' % 1111.1111)  # 取7位有效數字1111.111
      print('%.2g' % 1111.1111)  # 取2位有效數字,自動轉換為科學計數法1.1e+03

      3、字串輸出

      語法說明

      格式化符號說明備註 %s 字串輸出 string%10s 右對齊,佔位符 10位%-10s 左對齊,佔位符 10 位 %.2s 擷取 2 位字串 %10.2s10 位佔位符,擷取兩位字串。

      舉個栗子:

      print('%s' % 'hello world')       # 字串輸出hello world
      print('%20s' % 'hello world')     # 右對齊,取20位,不夠則補位         hello world
      print('%-20s' % 'hello world')    # 左對齊,取20位,不夠則補位hello world         
      print('%.2s' % 'hello world')     # 取2位he
      print('%10.2s' % 'hello world')   # 右對齊,取2位        he
      print('%-10.2s' % 'hello world')  # 左對齊,取2位he
    5. 將 mode 設定為 w+ 或 a+ 時,發現直接進行讀操作,得到的內容都是空,但原因不太相同:

      如果 mode 設定為 w+,即使沒有執行 write 操作,也會將檔案內容清空,因此這個時候直接進行讀草稿,讀到的是空內容。

      f = open("E:\\administrator\\Desktop\\test.txt", "w+")

      如果 mode 設定為 a+,檔案指標位置預設在最後面,因為讀內容時,是按照指標的位置往後讀,所以如果指標位置在最後,那讀出來的是空,在讀之前,一定要注意確認好指標位置是對的。

      f = open("E:\\administrator\\Desktop\\test.txt", "a+")
      f.write("append content")
      print(f.tell())  #此時指標在檔案字元末尾處
      f.seek(0)
      print(f.tell())  # 指標回到0的位置
      str = f.read()
      print(str)
      f.close()f = open("E:\\administrator\\Desktop\\test.txt", "w+")
    6. 對齊方式的取值:

      • <:左對齊
      • >:右對齊
      • ^:居中
      • =:在正負號(如果有的話)和數字之間填充,該對齊選項僅對數字型別有效。它可以輸出類似+0000120這樣的字串。
      >>> print("|",format("RUNOOB","*>30"),"|")    #左對齊
      | ************************RUNOOB |
      >>> print("|",format("RUNOOB","*^30"),"|")    #居中對齊
      | ************RUNOOB************ |
      >>> print("|",format("RUNOOB","*<30"),"|")    #右對齊
      | RUNOOB************************ |
      >>>