1. 程式人生 > >完美世界1面

完美世界1面

應聘職位:Python開發工程師

問題1.執行緒程序定義區別?

定義

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點:

  • 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。
  • 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
  • 程式的執行速度可能加快
  • 在一些等待的任務實現上如使用者輸入、檔案讀寫和網路收發資料等,執行緒就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如記憶體佔用等等。

關係

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

相對程序而言,執行緒是一個更加接近於執行體的概念,它可以與同進程中的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的執行序列。

區別

程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

1) 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

2) 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

3) 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

4) 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

問題2:

迭代器和生成器?

瞭解Python的資料結構時,要先了解容器(container)、可迭代物件(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推導式(list,set,dict comprehension)。

容器(container)

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用innot in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件)在Python中。

可迭代物件(iterable)

很多容器都是可迭代物件,此外還有更多的物件同樣也是可迭代物件,比如處於開啟狀態的files,sockets等等。但凡是可以返回一個迭代器的物件都可稱之為可迭代物件。

迭代器(iterator)

那麼什麼迭代器呢?它是一個帶狀態的物件,他能在你呼叫next()方法的時候返回容器中的下一個值

生成器(generator)

生成器算得上是Python語言中最吸引人的特性之一,生成器其實是一種特殊的迭代器,不過這種迭代器更加優雅。它的返回值不是通過return而是用yield

問題3:

編碼:input:list a=[1,2,3,4,5,6]

output:list [1,3,5]

一開始的方法:

for x in a:

    if(x%2!=0):

       b.append(x)

print(b)

方法2

a=[1,2,3,4,5,6]

b=[]

while len(a)>0:

    l= a.pop()

   if(x%2!=0):

        b.append(x)

然後面試官說用到了,a,b兩個string,浪費記憶體,不用b

問題4:

將一個string轉換成數值

  #!/usr/bin/python # -*- coding: UTF-8 -*- def string_to_int(s):     if s is None:         return 0.0     try:         return int(s)     except Exception:         return 0.0 s="123"

print(string_to_int(s));  

問題5:

strcmp,strcpy,strcat用法?

strcat(dest,src)把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')並新增'\0
strcpy(dest,src)把從src地址開始且含有null結束符的字串複製到以dest開始的地址空間

 strcmp 字串比較

char *s1,*s2="hello"; strcpy(s1,s2); //把字串s2複製到s1上,返回s1 int strcmp(*s1,*s2) s1>s2 返回正值 s1<s2 返回負值 s1=s2 返回 0