黑馬程式員總結2--python進階編程,2--python進階編程

來源:互聯網
上載者:User

黑馬程式員總結2--python進階編程,2--python進階編程

Python開發的10個小貼士

筆試題

def extendList(val,list=[]):    list.append(val)    return listlist1=extendList(10)list2=extendList(123,['a','b','c'])list3=extendList('a')print(list1)print(list2)print(list3)
[10, 'a']['a', 'b', 'c', 123][10, 'a']

list2調用時,初始化並傳入了2列表參數

list1和list3list2調用時沒有參數,使用了extentdList預設初始化的list,(是同一地址,且列表可變)所以兩次分別把10和a添加到list,得到[10,'a']。

返回給list1和list3的都是extendList初始化的list的地址,所以返回的值相同


A.import math

有時候我們只需要用到模組中的某個函數,只需要引入該函數即可,此時可以用下面方法實現:
B.from 模組名 import 函數名1,函數名2....


C.from modname import name1[, name2[, ... nameN]]
from fib import fibonacci
注意
不會把整個fib模組匯入到當前的命名空間中,它只會將fib裡的fibonacci單個引入

D.把一個模組的所有內容全都匯入到當前的命名空間也是可行的,只需使用如下聲明:
from modname import *

這提供了一個簡單的方法來匯入一個模組中的所有項目。然而這種聲明不該被過多地使用。
E.as
import time as tt



每個Python檔案都可以作為一個模組,模組的名字就是檔案的名字。

比如有這樣一個檔案test.py,在test.py中定義了函數add

test.py

    def add(a,b):
        return a+b
在其他檔案中就可以先import test,然後通過test.add(a,b)來調用了,當然也可以通過from test import add來引入

main.py
    import test
    result = test.add(11,22)
    print(result)
可以根據__name__變數的結果能夠判斷出,是直接執行的python指令碼還是被引入執行的,從而能夠有選擇性的執行測試代碼


包將有聯絡的模組組織在一起,即放到同一個檔案夾下,並且在這個檔案夾建立一個名字為__init__.py 檔案,那麼這個檔案夾就稱之為包
__init__.py檔案有什麼用

__init__.py 控制著包的匯入行為

2.1 __init__.py為空白

僅僅是把這個包匯入,不會匯入包中的模組


本地模組安裝的方式
找到模組的壓縮包
解壓
進入檔案夾
執行命令python setup.py install
謂的列表推導式,就是指的輕量級迴圈建立列表
set、list、tuple之間可以相互轉換


使用set,可以快速的完成對list中的元素去重複的功能


面試
class A(object):
    def foo(self,x):
        print('foo(%s,%s)'%(self,x))


    @classmethod
    def class_foo(self,x):
        print('foo(%s,%s)'%(self,x))


    @staticmethod
    def static_foo(x):
        print('foo(%s)'%x))
a=A()
a.foo(1)
print(a)
a.class_foo(1)
a.static_foo(1) 
foo(<__main__.A object at 0x7f3adbdf37b8>,1)
<__main__.A object at 0x7f3adbdf37b8>
foo(<class '__main__.A'>,1)
foo(1)



python核心編程
L = [ x*2 for x in range(5)]

產生器的特點:

  1. 節約記憶體
  2. 迭代到下一次的調用時,所使用的參數都是第一次所保留下的,即是說,在整個所有函數調用的參數都是第一次所調用時保留的,而不是新建立的

  • 凡是可作用於 for 迴圈的對象都是 Iterable 類型;
  • 凡是可作用於 next() 函數的對象都是 Iterator 類型
  • 集合資料類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函數獲得一個 Iterator 對象。

一個閉包的實際例子:
def line_conf(a, b):    def line(x):        return a*x + b    return lineline1 = line_conf(1, 1)line2 = line_conf(4, 5)print(line1(5))print(line2(5))
閉包也具有提高代碼可複用性的作用。



模組修改,要重新載入reload
避免迴圈匯入,雞生蛋,蛋生雞


  • is 是比較兩個引用是否指向了同一個對象(引用比較)。
  • == 是比較兩個對象是否相等。



淺拷貝:拷貝引用,沒有拷貝內容,地址給了,指向同一地址。
深拷貝:對一個對象所有層次的拷貝,藉助copy.deepcopy模組。內容複寫到新記憶體

列表拷貝可變,新記憶體。元祖不可變,copy.copy()指向同一位置(記憶體)。


記憶體回收
  • 小整數[-5,257)共用對象,常駐記憶體
  • 單個字元共用對象,常駐記憶體
  • 單個單詞,不可修改,預設開啟intern機制,共用對象,引用計數為0,則銷毀 


閉包,先調用外邊參數,接著傳參調用裡邊函數。用來防止變數重複傳。簡化調用。最佳化變數。
def foo():
print('foo')
foo #表示是函數
foo() #表示執行foo函數
def foo():
print('foo')
foo = lambda x: x + 1
foo() # 執行下面的lambda運算式,而不再是原來的foo函數,因為foo這個名字被lambda匿名函數覆蓋了
裝飾器到了就自動執行,函數閉包調用



系統編程
進程線程


進程,能夠完成多任務,比如 在一台電腦上能夠同時運行多個QQ
線程,能夠完成多任務,比如 一個QQ中的多個聊天視窗
實現方式都是兩種
多任務,時間片輪轉,優先順序調用。 並發:有處理多任務能力,不一定同時。並行:同時處理多任務。
fork返回值特殊,生出多進程。fork()調用一次,返回兩次,2返回值。   
子進程永遠返回0,而父進程返回子進程的ID。,父進程大於0;


多進程中,每個進程中所有資料(包括全域變數)都各有擁有一份,互不影響
多進程如果是對齊,符合2的n,每人都要fork一次


伺服器處理序很多,pid類似身份證,不會同多進程中,每個進程中所有資料(包括全域變數)都各有擁有一份,互不影響,父進程、子進程執行順序沒有規律,完全取決於作業系統的調度演算法。總進程:2*n 次,一般不超過8次。
multiprocessing模組提供了一個Process類來代表一個進程對象,子進程可以用類來實現
while true 慎用
超級多任務,Pool進程池 緩衝   apply堵塞式
使用多線程並發的操作,節約時間,執行順序無關
線程共用全域變數,資料共用容易,列表傳參也共用。進程不能(誕生進程通訊)
os模組建立檔案夾,os.mkdir(),print調試
Queue可以用來解決百分比問題


線程:
多線程並發的操作,花費時間要短很多
建立好的線程,需要調用start()方法來啟動
線程建立好了一起執行
在多線程開發中,全域變數是多個線程都共用的資料,而局部變數等是各自線程的,是非共用的
    同步(上鎖,有規律):同步就是協同步調,按預定的先後次序進行運行。如:你說完,我再說。 如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。
     非同步:無約定


同步調用就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去
非同步呼叫就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。


     重構:重寫


一個ThreadLocal變數雖然是全域變數,但每個線程都只能讀寫自己線程的獨立副本,互不干擾。ThreadLocal解決了參數在一個線程中各個函數之間互相傳遞的問題






對於全域變數,在多線程中要格外小心,否則容易造成資料錯亂的情況發生


網路編程
TCP/IP協議族,現實4層
連接埠,標記進程的東西(同台電腦用pid),不同電腦通訊
IP地址127.0.0.1~127.255.255.255用於迴路測試   網路號+多播號不能用(多播,有些能看有些不能,視頻會議)
連網裝置都有ip
利用ip地址,協議,連接埠就可以標識網路的進程了,網路中的進程通訊就可以利用這個標誌與其它進程進行互動

socket   ip+連接埠+協議
迴圈儘可能代碼少,節約

TFTP用戶端


     下載:建立檔案—寫資料—關閉
      上傳:


cisco packet


掩碼:二進位的掩碼與ip按位與,得到網路號,(c類最後位255.255.255.0),3個255表示網路號,0表示主機號
網線只能連2台電腦(網路多台資料電訊號錯亂),多台交換器淘汰了集線器(USB拓展)
路由器(Router)又稱網關裝置(Gateway)是用於串連多個邏輯上分開的網路
網卡:物理地址,實際地址
預設閘道:
不在同一網段的pc,需要設定預設閘道才能把資料傳送過去 通常情況下,都會把路由器預設閘道
集線器:廣播,交換器:更智能
tcp規定跨網不能直接通訊,路由器雙網卡雙ip,左手右手,可以串連不同網段,
ip地址通訊不會變化,mac地址會變化
ping TTL=128,經過一次路由器減一
cdn分發,各地放置伺服器
arp三方造假
nat:ip 內網和外網能上,路由表地址轉換,只能向外才能映射,自己搭建伺服器不能外網訪問,藉助花生殼。
















   
0
0
查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.