在python中變量不直接存儲值,python釋放變量內存_看完2019年阿里巴巴Python面試題詳解,月薪3萬不是夢

 2023-11-18 阅读 22 评论 0

摘要:很多人想自學Python找工作,下面給大家分享一部分阿里巴巴的Python開發工程師的面試題目:概念理解類題目:1.請說一下你對迭代器和生成器的區別?答:(1)迭代器是一個更抽象的概念,任何對象,如果它的類有next方法和iter方法返回

很多人想自學Python找工作,下面給大家分享一部分阿里巴巴的Python開發工程師的面試題目:

5c12f478363acf6971a65872187895fa.png

概念理解類題目:

1.請說一下你對迭代器和生成器的區別?

答:(1)迭代器是一個更抽象的概念,任何對象,如果它的類有next方法和iter方法返回自己本身。對于string、list、dict、tuple等這類容器對象,使用for循環遍歷是很方便的。在后臺for語句對容器對象調用iter()函數,iter()是python的內置函數。iter()會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內元素,next()也是python的內置函數。在沒有后續元素時,next()會拋出一個StopIteration異常

在python中變量不直接存儲值,(2)生成器(Generator)是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在需要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最后一次執行的位置和所有的數據值)

區別:生成器能做到迭代器能做的所有事,而且因為自動創建了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省內存。除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常

3f4d5a0038e1ca30b0ec2b27a4a89856.png

2.什么是線程安全?

線程安全是在多線程的環境下,能夠保證多個線程同時執行時程序依舊運行正確, 而且要保證對于共享的數據可以由多個線程存取,但是同一時刻只能有一個線程進行存取。多線程環境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性。

2019黑馬python,3.什么是私有變量?

小寫和一個前導下劃線 _private_value

Python 中不存在私有變量一說,若是遇到需要保護的變量,使用小寫和一個前導下劃線。但這只是程序員之間的一個約定,用于警告說明這是一個私有變量,外部類不要去訪問它。但實際上,外部類還是可以訪問到這個變量。

4.內置變量

python申請內存。小寫,兩個前導下劃線和兩個后置下劃線 __class__

兩個前導下劃線會導致變量在解釋期間被更名。這是為了避免內置變量和其他變量產生沖突。用戶定義的變量要嚴格避免這種風格。以免導致混亂。

bea5ca1b38eb43a414c57c2d9ebf6b4e.png

5.函數和方法

總體而言應該使用,小寫和下劃線。但有些比較老的庫使用的是混合大小寫,即首單詞小寫,之后每個單詞第一個字母大寫,其余小寫。但現在,小寫和下劃線已成為規范。

python最新2019。私有方法 :小寫和一個前導下劃線

這里和私有變量一樣,并不是真正的私有訪問權限。同時也應該注意一般函數不要使用兩個前導下劃線(當遇到兩個前導下劃線時,Python 的名稱改編特性將發揮作用)。

特殊方法 :小寫和兩個前導下劃線,兩個后置下劃線

這種風格只應用于特殊函數,比如操作符重載等。

python管理內存,函數參數 : 小寫和下劃線,缺省值等號兩邊無空格

6.類

類總是使用駝峰格式命名,即所有單詞首字母大寫其余字母小寫。類名應該簡明,精確,并足以從中理解類所完成的工作。常見的一個方法是使用表示其類型或者特性的后綴,例如:

SQLEngine,MimeTypes對于基類而言,可以使用一個 Base 或者 Abstract 前綴BaseCookie,AbstractGroup

5cb34652bad2a42aeb407ed40bc48a40.png

用vs2019寫python。7.模塊和包

除特殊模塊 __init__ 之外,模塊名稱都使用不帶下劃線的小寫字母。

若是它們實現一個協議,那么通常使用lib為后綴,例如:

import smtplib

python申請內存函數。import os

import sys

8.Python是如何進行內存管理的?

一、垃圾回收:python不像C++,Java等語言一樣,他們可以不用事先聲明變量類型而直接對變量進行賦值。對Python語言來講,對象的類型和內存都是在運行時確定的。這也是為什么我們稱Python語言為動態類型的原因(這里我們把動態類型可以簡單的歸結為對變量內存地址的分配是在運行時自動判斷變量類型并對變量進行賦值)。

二、引用計數:Python采用了類似Windows內核對象一樣的方式來對內存進行管理。每一個對象,都維護這一個對指向該對對象的引用的計數。當變量被綁定在一個對象上的時候,該變量的引用計數就是1,(還有另外一些情況也會導致變量引用計數的增加),系統會自動維護這些標簽,并定時掃描,當某標簽的引用計數變為0的時候,該對就會被回收。

三、內存池機制Python的內存機制以金字塔行,-1,-2層主要有操作系統進行操作,

  第0層是C中的malloc,free等內存分配和釋放函數進行操作;

  第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小于256K時有該層直接分配內存;

  第3層是最上層,也就是我們對Python對象的直接操作;

在 C 中如果頻繁的調用 malloc 與 free 時,是會產生性能問題的.再加上頻繁的分配與釋放小塊的內存會產生內存碎片. Python 在這里主要干的工作有:

  如果請求分配的內存在1~256字節之間就使用自己的內存管理系統,否則直接使用 malloc.

  這里還是會調用 malloc 分配內存,但每次會分配一塊大小為256k的大塊內存.

  經由內存池登記的內存到最后還是會回收到內存池,并不會調用 C 的 free 釋放掉.以便下次使用.對于簡單的Python對象,例如數值、字符串,元組(tuple不允許被更改)采用的是復制的方式(深拷貝?),也就是說當將另一個變量B賦值給變量A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會重新給A分配空間,A和B的地址變得不再相同

41bea418537dd25c1c98aa61076cabee.png

函數方法使用類題目

1.Python里面如何生成隨機數?

答:random模塊

隨機整數:random.randint(a,b):返回隨機整數x,a<=x<=b

random.randrange(start,stop,[,step]):返回一個范圍在(start,stop,step)之間的隨機整數,不包括結束值。

隨機實數:random.random( ):返回0到1之間的浮點數

random.uniform(a,b):返回指定范圍內的浮點數。

2.有沒有一個工具可以幫助查找python的bug和進行靜態的代碼分析?

答:PyChecker是一個python代碼的靜態分析工具,它可以幫助查找python代碼的bug, 會對代碼的復雜度和格式提出警告

Pylint是另外一個工具可以進行codingstandard檢查

3.如何在一個function里面設置一個全局的變量?

答:解決方法是在function的開始插入一個global聲明:

def f()global x

4.單引號,雙引號,三引號的區別

答:單引號和雙引號是等效的,如果要換行,需要符號(),三引號則可以直接換行,并且可以包含注釋

如果要表示Let’s go 這個字符串

單引號:s4 = ‘Let’s go’雙引號:s5 = “Let’s go”s6 = ‘I realy like“python”!’

這就是單引號和雙引號都可以表示字符串的原因了

5.find和grep的區別?

grep命令是一種強大的文本搜索工具,grep搜索內容串可以是正則表達式,允許對文本文件進行模式查找。如果找到匹配模式, grep打印包含模式的所有行。

find通常用來在特定的目錄下搜索符合條件的文件,也可以用來搜索特定用戶屬主的文件。

6.使用 has 或 is 前綴命名布爾元素

is_connect = True

has_member = False

7.用復數形式命名序列

members = ['user_1', 'user_2']

8. 用顯式名稱命名字典

person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}

9.python 中 yield 的用法?

答: yield簡單說來就是一個生成器,這樣函數它記住上次返 回時在函數體中的位置。對生成器第 二次(或n 次)調用跳轉至該函 次)調用跳轉至該函 數。

爬蟲和數據庫

6b0010d074b1d7e3960ecfb6094109e0.png

1.你用過的爬蟲框架或者模塊有哪些?談談他們的區別或者優缺點?

Python自帶:urllib,urllib2

第 三 方:requests

框 架:Scrapy

urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。

urllib2.:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,并以此可以來設置一個URL 的headers),urllib.urlopen只接收一個url

urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會一起使用的原因

scrapy是封裝起來的框架,他包含了下載器,解析器,日志及異常處理,基于多線程, twisted的方式處理,對于固定單個網站的爬取開發,有優勢,但是對于多網站爬取 100個網站,并發及分布式處理方面,不夠靈活,不便調整與括展。

request 是一個HTTP庫, 它只是用來,進行請求,對于HTTP請求,他是一個強大的庫,下載,解析全部自己處理,靈活性更高,高并發與分布式部署也非常靈活,對于功能可以更好實現.

2.scrapy和scrapy-redis有什么區別?為什么選擇redis數據庫?

1) scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定制性,但是不支持分布式。而scrapy-redis一套基于redis數據庫、運行在scrapy框架之上的組件,可以讓scrapy支持分布式策略,Slaver端共享Master端redis數據庫里的item隊列、請求隊列和請求指紋集合。

2) 為什么選擇redis數據庫,因為redis支持主從同步,而且數據都是緩存在內存中的,所以基于redis的分布式爬蟲,對請求和數據的高頻讀取效率非常高。

3.數據庫的優化?

1. 優化索引、SQL 語句、分析慢查詢;

2. 設計表的時候嚴格根據數據庫的設計范式來設計數據庫;

3. 使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能

節約磁盤IO;

4. 優化硬件;采用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;

5. 采用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁

盤的讀取效率;

6. 垂直分表;把一些不經常讀的數據放在一張表里,節約磁盤I/O;

7. 主從分離讀寫;采用主從復制把數據庫的讀操作和寫入操作分離開來;

8. 分庫分表分機器(數據量特別大),主要的的原理就是數據路由;

9. 選擇合適的表引擎,參數上的優化;

10. 進行架構級別的緩存,靜態化和分布式;

11. 不采用全文索引;

12. 采用更快的存儲方式,例如 NoSQL存儲經常訪問的數據

結尾

以上只是一部分題目,關注小編,我這里有很多Python學習資料,我會每天和大家分享我的學習方法以及根變成有關的趣事。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/177589.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息