python中的eval函數(shù) 原創(chuàng)
創(chuàng)新互聯(lián)建站主營西峰網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),西峰h5微信小程序開發(fā)搭建,西峰網(wǎng)站營銷推廣歡迎西峰等地區(qū)企業(yè)咨詢
2019-12-29 19:51:43
難得 yx
碼齡3年
關(guān)注
文章目錄
eval函數(shù)是什么
字符串轉(zhuǎn)換成列表
字符串轉(zhuǎn)換成字典
字符串轉(zhuǎn)換成元組
eval函數(shù)是什么
eval是Python的一個(gè)內(nèi)置函數(shù),這個(gè)函數(shù)的作用是,返回傳入字符串的表達(dá)式的結(jié)果。
即變量賦值時(shí),等號右邊的表達(dá)式寫成字符串的格式,返回值就是這個(gè)表達(dá)式的結(jié)果。
在這里插入圖片描述
舉例:
在這里插入圖片描述
字符串轉(zhuǎn)換成列表
在這里插入圖片描述
在這里插入圖片描述
字符串轉(zhuǎn)換成字典
在這里插入圖片描述
字符串轉(zhuǎn)換成元組
在這里插入圖片描述
注意:
python與其他語言不一樣的地方之一,就在于它可以計(jì)算字符串的數(shù)值
在這里插入圖片描述
文章知識點(diǎn)與官方知識檔案匹配
Python入門技能樹基礎(chǔ)語法函數(shù)
211446 人正在系統(tǒng)學(xué)習(xí)中
打開CSDN APP,看更多技術(shù)內(nèi)容
eval函數(shù)的作用_夏木炎的博客_eval()函數(shù)的作用是什么?
eval函數(shù)是強(qiáng)大的數(shù)碼轉(zhuǎn)換引擎,字符串經(jīng)eval轉(zhuǎn)換后得到一個(gè)javascript對象, var a = eval(“5″);等效于var a = 5; var a = eval(“’5′”);等效于var a = ’5′; var obj = eval(“({name:’cat’,color:’black’...
繼續(xù)訪問
...的作用_拾憶11的博客_js的eval()函數(shù)的作用是什么?
那么說明:eval()函數(shù)動(dòng)態(tài)執(zhí)行的代碼并不會(huì)創(chuàng)建新的作用域,其代碼就是在當(dāng)前的作用域執(zhí)行的。因此也就是說,eval()函數(shù)也完全可以使用當(dāng)前作用域的this,argument等對象。 在IE中,支持這樣一種和eval()非常類似的函數(shù)叫做:execScript()...
繼續(xù)訪問
js中eval()函數(shù)的作用
一、eval() 函數(shù)作用: eval()可以接受一個(gè)字符串str作為參數(shù),并把這個(gè)參數(shù)作為腳本代碼來 執(zhí)行。 二、接受的參數(shù): (1)如果參數(shù)是一個(gè)表達(dá)式,eval() 函數(shù)將執(zhí)行表達(dá)式; (2) 如果參數(shù)是Javascript語句,eval()將執(zhí)行 Javascript 語句 注:(如果執(zhí)行結(jié)果是一個(gè)值就返回,不是就返回undefined,如果參數(shù)不是一個(gè)字符串,則直接返回該參數(shù)) 三、語法: eval(string)。 四、實(shí)例: eval(“var a=1”);//聲明一個(gè)變量a并賦值1。 eva
繼續(xù)訪問
JavaScript中的 eval() 函數(shù)究竟有什么用
之前對eval()函數(shù)一直有一些疑問,覺得沒什么用,很疑惑為什么設(shè)計(jì)這樣一個(gè)方法,今天來總結(jié)一下。 1、定義和用法 eval() 函數(shù)可計(jì)算某個(gè)字符串,并執(zhí)行其中的的 JavaScript 代碼。 返回通過計(jì)算 string 得到的值(如果有的話,無值返回undefined)。只接受原始字符串作為參數(shù),如果 string 參數(shù)不是原始字符串,那么該方法將不作任何改變地返回。 如
繼續(xù)訪問
...的使用詳解_滌生大數(shù)據(jù)的博客_eval()函數(shù)的作用是什么?
eval是Python的一個(gè)內(nèi)置函數(shù),功能十分強(qiáng)大,這個(gè)函數(shù)的作用是,返回傳入字符串的表達(dá)式的結(jié)果。就是說:將字符串當(dāng)成有效的表達(dá)式 來求值 并 返回計(jì)算結(jié)果。 eval函數(shù)就是實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化,同樣str函數(shù)把list,dict,tuple...
繼續(xù)訪問
Python中eval函數(shù)的作用_小小平不平凡的博客_eval函數(shù)...
如果source是一個(gè)輸出語句,如print(),則eval()返回結(jié)果為None; 除以上2種情況外,source表達(dá)式的結(jié)果就是eval()函數(shù)的返回值 示例 1、 x = 10 def func(): y = 20 #局部變量y a = eval("x+y") print("a:",a) #x沒...
繼續(xù)訪問
最新發(fā)布 Python的內(nèi)置函數(shù)(二十一)、eval()
描述 eval() 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 語法 以下是 eval() 方法的語法: eval(expression[, globals[, locals]]) 參數(shù) expression -- 表達(dá)式。 globals -- 變量作用域,全局命名空間,如果被提供,則必須是一個(gè)字典對象。 locals -- 變量作用域,局部命名空間,如果被提供,可以是任...
繼續(xù)訪問
python中eval()函數(shù)的作用及使用方法
大家好,我是J哥 今天給大家介紹python基礎(chǔ)中eval()函數(shù)的作用: 理解: eval()函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 也可以這樣來理解:eval()函數(shù)就是實(shí)現(xiàn)list、dict、tuple、與str之間的轉(zhuǎn)化 語法: eval(expression[, globals[, locals]]) 參數(shù): expression – 表達(dá)式。 globals – 變量作用域,全局命名空間,如果被提供,則必須是一個(gè)字典對象。 locals – 變量作用域,局部命名空間,如果被提供
繼續(xù)訪問
Python中eval()函數(shù)的使用_W_chuanqi的博客_python eval
eval() 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 語法 eval(expression[, globals[, locals]]) expression – 表達(dá)式。 globals – 變量作用域,全局命名空間,如果被提供,則必須是一個(gè)字典對象。 locals–變量作用域,局部命名...
繼續(xù)訪問
Javascript中eval()函數(shù)的作用_天天向尚6的博客
【eval()函數(shù)】JavaScript有許多小竅門來使編程更加容易。其中之一就是eval()函數(shù),這個(gè)函數(shù)可以把一個(gè)字符串當(dāng)作一個(gè)JavaScript表達(dá)式一樣去執(zhí)行它。舉個(gè)小例子:var the_unevaled_answer = "2 + 3";var the_evaled_answer = eval(...
繼續(xù)訪問
熱門推薦 python中的eval函數(shù)的使用詳解
eval是Python的一個(gè)內(nèi)置函數(shù),功能十分強(qiáng)大,這個(gè)函數(shù)的作用是,返回傳入字符串的表達(dá)式的結(jié)果。就是說:將字符串當(dāng)成有效的表達(dá)式來求值 并返回計(jì)算結(jié)果。 eval函數(shù)就是實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化,同樣str函數(shù)把list,dict,tuple轉(zhuǎn)為為字符串 1.eval的語法 eval(expression[, globals[, loc...
繼續(xù)訪問
eval()函數(shù)的作用
eval()函數(shù)的作用 eval()函數(shù)功能是將某段字符串當(dāng)成JS語句來執(zhí)行。 eval() 函數(shù)計(jì)算 JavaScript 字符串,并把它作為腳本代碼來執(zhí)行。 如果參數(shù)是一個(gè)表達(dá)式,eval() 函數(shù)將執(zhí)行表達(dá)式。如果參數(shù)是Javascript語句,eval()將執(zhí)行 Javascript 語句。 var a=eval("12"); //相當(dāng)于 var a=12; var obj = eval("({name:'nick',age:28})"); //相當(dāng)于 var obj = {name:'nick
繼續(xù)訪問
Python中eval的強(qiáng)大與危害
eval是Python的一個(gè)內(nèi)置函數(shù),這個(gè)函數(shù)的作用是,返回傳入字符串的表達(dá)式的結(jié)果。想象一下變量賦值時(shí),將等號右邊的表達(dá)式寫成字符串的格式,將這個(gè)字符串作為eval的參數(shù),eval的返回值就是這個(gè)表達(dá)式的結(jié)果。 python中eval函數(shù)的用法十分的靈活,但也十分危險(xiǎn),安全性是其最大的缺點(diǎn)。本文從靈活性和危險(xiǎn)性兩方面介紹eval。 1、強(qiáng)大之處 舉幾個(gè)例子感受一下,字符串與list、tuple、...
繼續(xù)訪問
python的eval函數(shù)
1.eval函數(shù)的語法及用法 (1)語法:eval(expression) 參數(shù)說明 expression:字符串表達(dá)式,可為算法,也可為input函數(shù)等。 說明:表達(dá)式必需是字符串,否則會(huì)報(bào)錯(cuò),比如直接輸入數(shù)值會(huì)報(bào)錯(cuò)為:“TypeError: eval() arg 1 must be a string, bytes or code object”,如下圖所示。 (2)作用:接收運(yùn)行一個(gè)字符串表達(dá)式,返回表達(dá)式的結(jié)果值。 2.實(shí)例 (1)簡單的計(jì)算用法 例1:求得2+3得值。 e
繼續(xù)訪問
Eval函數(shù)知識總結(jié)
說道Json,我們先來聊聊eval 一、eval是什么?(解析器) eval是一個(gè)函數(shù),看本質(zhì)function eval() { [native code] } 二、怎樣使用eval? 語法:string 必需。要計(jì)算的字符串,其中含有要計(jì)算的 JavaScript 表達(dá)式或要執(zhí)行的語句。通過計(jì)算 string 得到的值(如果有的話) 該方法只接受原始字符串作為參數(shù),只接受一個(gè)...
繼續(xù)訪問
eval在JS中的作用
form: eval函數(shù)是強(qiáng)大的數(shù)碼轉(zhuǎn)換引擎,字符串經(jīng)eval轉(zhuǎn)換后得到一個(gè)javascript對象, 舉簡單例子: var a = eval(“5″);等效于var a = 5; var a = eval(“’5′”);等效于var a = ’5′; var obj = eval(“({name:’cat’,colo...
繼續(xù)訪問
Python中eval()函數(shù)的使用
今天給大家分享一下Python中的eval()函數(shù),如果感覺博主的文章還不錯(cuò)的話,希望大家點(diǎn)贊支持一下博主 文章目錄eval()函數(shù)語法實(shí)例實(shí)例1實(shí)例2實(shí)例3 eval()函數(shù) eval() 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 語法 eval(expression[, globals[, locals]]) expression – 表達(dá)式。 globals – 變量作用域,全局命名空間,如果被提供,則必須是一個(gè)字典對象。 locals–變量作用域,局部命名空間,如果被提供,可以是任何映
繼續(xù)訪問
python中eval函數(shù)作用
1. 字符串轉(zhuǎn)換成列表 2. 字符串轉(zhuǎn)換成字典 3. 字符串轉(zhuǎn)換成元組 4. 將字符串轉(zhuǎn)換成表達(dá)式執(zhí)行 eval函數(shù)就是實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化 str函數(shù)把list,dict,tuple轉(zhuǎn)為為字符串 1. 字符串轉(zhuǎn)換成列表 2. 字符串轉(zhuǎn)換成字典 3. 字符串轉(zhuǎn)換成元組 4. 將字符串轉(zhuǎn)換成表達(dá)式執(zhí)行 eval雖然方便,但是要注意安全性,可以將字符串轉(zhuǎn)成表達(dá)式...
繼續(xù)訪問
Python 3 內(nèi)置函數(shù) eval( )
描述: eval( ) 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。
繼續(xù)訪問
python 中 eval()函數(shù)的作用
eval函數(shù)就是實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化 str函數(shù)把list,dict,tuple轉(zhuǎn)為為字符串 eval(a) str(b)
繼續(xù)訪問
eval 是什么
eval 是全局對象上的一個(gè)函數(shù),會(huì)把傳入的字符串當(dāng)做 JavaScript 代碼執(zhí)行。如果傳入的參數(shù)不是字符串,它會(huì)原封不動(dòng)地將其返回。eval 分為直接調(diào)用和間接調(diào)用兩種,通常間接調(diào)用的性能會(huì)好于直接調(diào)用。 直接調(diào)用時(shí),eval 運(yùn)行于其調(diào)用函數(shù)的作用域下; var context = 'outside'; (function(){ var context = 'inside'; return eval('context'); })(); // return 'inside' ..
繼續(xù)訪問
python中eval函數(shù)的作用后悔沒早知道
在本篇文章里小編給大家整理的是關(guān)于python中eval函數(shù)作用以及實(shí)例代碼,需要的朋友們參考下吧。 eval() 函數(shù)用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 eval函數(shù)功能:將字符串str當(dāng)成有效的表達(dá)式來求值并返回計(jì)算結(jié)果。eval函數(shù)可以實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化 eval() 方法的語法: 1 eval(expression[, global...
繼續(xù)訪問
python里的eval是什么
python里的eval()函數(shù)是用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。 例題:數(shù)值運(yùn)算 描述 獲得用戶輸入的一個(gè)字符串,格式如下:????????????????????????? M OP N??????????????????????????????????????????????????????? 其中,M和N是任何數(shù)字,OP代表一種操作,表示為如下四種:+, -, *, /(加減乘除)????????????????????????????????????????????? 根據(jù)OP,輸出M
繼續(xù)訪問
python3中eval函數(shù)用法簡介
python中eval函數(shù)的用法十分的靈活,這里主要介紹一下它的原理和一些使用的場合。 下面是從python的官方文檔中的解釋: The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can
繼續(xù)訪問
eval()函數(shù)的
1、定義函數(shù)
函數(shù)是可重用的程序。本書中已經(jīng)使用了許多內(nèi)建函數(shù),如len()函數(shù)和range()函數(shù),但是還沒自定義過函數(shù)。定義函數(shù)的語法格式如下:
def 函數(shù)名(參數(shù)):
函數(shù)體
定義函數(shù)的規(guī)則如下:
①關(guān)鍵字def用來定義一個(gè)函數(shù),它是define的縮寫。
②函數(shù)名是函數(shù)的唯一標(biāo)識,函數(shù)名的命名規(guī)則遵循標(biāo)識符的命名規(guī)則。
③函數(shù)名后面一定要緊跟著一個(gè)括號,括號內(nèi)的參數(shù)是可選的,括號后面要有冒號。
④函數(shù)體(statement)為一個(gè)或一組Python語句,注意要有縮進(jìn)。
⑤函數(shù)體的第一行可以有文檔字符串,用于描述函數(shù)的功能,用三引號括起來。
按照定義規(guī)則,可以定義第一個(gè)函數(shù)了:
def?hello_world():
...?????print('Hello,world!')???#?注意函數(shù)體要有縮進(jìn)
...
hello_world()
Hello,world!
這個(gè)函數(shù)不帶任何參數(shù),它的功能是打印出“Hello,world!”。最后一行代碼hello_world()是調(diào)用函數(shù),即讓Python執(zhí)行函數(shù)的代碼。
2、全局變量和局部變量
全局變量是定義在所有函數(shù)外的變量。例如,定義一個(gè)全局變量a,分別在函數(shù)test1()和test2()使用變量a:
a?=?100???#?全局變量
def?test1():
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
test2()
100
定義了全局變量a之后,在函數(shù)test1()和test2()內(nèi)都可以使用變量a,由此可知,全局變量的作用范圍是全局。
局部變量是在函數(shù)內(nèi)定義的變量,除了用關(guān)鍵字global修飾的變量以外。例如,在函數(shù)test1()內(nèi)定義一個(gè)局部變量a,分別在函數(shù)外和另一個(gè)函數(shù)test2()內(nèi)使用變量a:
def?test1():
...?????a?=?100???#?局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
NameError:?name?'a'?is?not?defined
test2()
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
File?"stdin",?line?2,?in?test2
NameError:?name?'a'?is?not?defined
Python解釋器提示出錯(cuò)了。由于局部變量a定義在函數(shù)test1()內(nèi),因此,在函數(shù)test1()內(nèi)可以使用變量a,但是在函數(shù)外或者另一個(gè)函數(shù)test2()內(nèi)使用變量a,都會(huì)報(bào)錯(cuò),由此可見,局部變量的作用范圍是定義它的函數(shù)內(nèi)部。
一般情況下,在函數(shù)內(nèi)聲明的變量都是局部變量,但是采用關(guān)鍵字global修飾的變量卻是全局變量:
def?test1():
...?????global?a???#?全局變量
...?????a?=?100
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
100
test2()
100
這個(gè)程序與上個(gè)程序相比,只是在函數(shù)test1()中多了一行代碼“global a”,程序便可以正確運(yùn)行了。在函數(shù)test1()中,采用關(guān)鍵字global修飾了變量a之后,變量a就變成了全局變量,不僅可以在該函數(shù)內(nèi)使用,還可以在函數(shù)外或者其他函數(shù)內(nèi)使用。
如果在某個(gè)函數(shù)內(nèi)局部變量與全局變量同名,那么在該函數(shù)中局部變量會(huì)覆蓋全局變量:
a?=?100???#?全局變量
def?test1():
...?????a?=?200???#?同名局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
200
test2()
100
由于在函數(shù)test1()中定義了一個(gè)與全局變量同名的局部變量a,因此,在函數(shù)test1()中全局變量a的值被局部變量覆蓋了,但是在函數(shù)test2()中全局變量a的值沒有被覆蓋。
綜上所述,在Python中,全局變量保存的數(shù)據(jù)供整個(gè)腳本文件使用;而局部變量只用于臨時(shí)保存數(shù)據(jù),變量僅供局部代碼塊使用。
from mydefa import A_def
print(A_def(2))#表示當(dāng)前Python腳本中調(diào)用另一個(gè)Python腳本(mydefa.py)中的A_def(2)函數(shù)
#或者import mydefa;print(mydefa.A_def(2))
'''以下代碼存入mydefa.py
import math
def A_def(r):
(Tab)return math.pi*r*r
#from math import pi
#def A_def(r):
#(Tab)return pi*r*r
'''
目錄
許多編程語言都有一個(gè)特殊的函數(shù),當(dāng)操作系統(tǒng)開始運(yùn)行程序時(shí)會(huì)自動(dòng)執(zhí)行該函數(shù)。這個(gè)函數(shù)通常被命名為main(),并且依據(jù)語言標(biāo)準(zhǔn)具有特定的返回類型和參數(shù)。另一方面,Python解釋器從文件頂部開始執(zhí)行腳本,并且沒有自動(dòng)執(zhí)行的特殊函數(shù)。
盡管如此,為程序的執(zhí)行定義一個(gè)起始點(diǎn)有助于理解程序是如何運(yùn)行的。Python程序員提出了幾種方式對此進(jìn)行實(shí)現(xiàn)。
本文結(jié)束時(shí),您將了解以下內(nèi)容:
Python中的基本main()函數(shù)
一些Python腳本中,包含一個(gè)函數(shù)定義和一個(gè)條件語句,如下所示:
此代碼中,包含一個(gè)main()函數(shù),在程序執(zhí)行時(shí)打印Hello World!。此外,還包含一個(gè)條件(或if)語句,用于檢查__name__的值并將其與字符串"__main__"進(jìn)行比較。當(dāng)if語句為True時(shí),Python解釋器將執(zhí)行main()函數(shù)。更多關(guān)于Python條件語句的信息可以由此獲得。
這種代碼模式在Python文件中非常常見,它將作為腳本執(zhí)行并導(dǎo)入另一個(gè)模塊。為了幫助理解這段代碼的執(zhí)行方式,首先需要了解Python解釋器如何根據(jù)代碼的執(zhí)行方式設(shè)置__name__。
Python中的執(zhí)行模式
Python解釋器執(zhí)行代碼有兩種方式:
更多內(nèi)容可參考如何運(yùn)行Python腳本。無論采用哪種方式,Python都會(huì)定義一個(gè)名為__name__的特殊變量,該變量包含一個(gè)字符串,其值取決于代碼的使用方式。
本文將如下示例文件保存為execution_methods.py,以 探索 代碼如何根據(jù)上下文改變行為:
在此文件中,定義了三個(gè)對print()函數(shù)的調(diào)用。前兩個(gè)打印一些介紹性短語。第三個(gè)print()會(huì)先打印短語The value __name__ is,之后將使用Python內(nèi)置的repr()函數(shù)打印出__name__變量。
在Python中,repr()函數(shù)將對象轉(zhuǎn)化為供解釋器讀取的形式。上述示例通過使用repr()函數(shù)來強(qiáng)調(diào)__name__的值為字符串。更多關(guān)于repr()的內(nèi)容可參考Python文檔。
在本文中,您將隨處可見文件(file),模塊(module)和腳本(script)這三個(gè)字眼。實(shí)際上,三者之間并無太大的差別。不過,在強(qiáng)調(diào)代碼目的時(shí),還是存在細(xì)微的差異:
“如何運(yùn)行Python腳本”一文也討論了三者的差別。
基于命令行執(zhí)行
在這類方法中,Python腳本將通過命令行來執(zhí)行。
執(zhí)行腳本時(shí),無法與Python解釋器正在執(zhí)行的代碼交互。關(guān)于如何通過命令行執(zhí)行代碼的詳細(xì)信息對本文而言并不重要,但您可以通過展開下框閱讀更多有關(guān)Windows,Linux和macOS之間命令行差異的內(nèi)容。
命令行環(huán)境
不同的操作系統(tǒng)在使用命令行執(zhí)行代碼時(shí)存在細(xì)微的差異。
在Linux和macOS中,通常使用如下命令:
美元符號($)之前的內(nèi)容可能有所不同,具體取決于您的用戶名和計(jì)算機(jī)名稱。您鍵入的命令位于$之后。在Linux或macOS上,Python3的可執(zhí)行文件名為python3,因此可以通過輸入python3 script_name.py來運(yùn)行python腳本。
在Windows上,命令提示符通常如下所示:
根據(jù)您的用戶名,之前的內(nèi)容可能會(huì)有所不同,您輸入的命令位于之后。在Windows上,Python3的可執(zhí)行文件通常為python。因此可以通過輸入python script_name.py來運(yùn)行python腳本。
無論哪種操作系統(tǒng),本文的Python腳本的輸出結(jié)果都是相同的。因此本文以Linux和macOS為例。
使用命令行執(zhí)行execution_methods.py,如下所示:
在這個(gè)示例中,__name__具有值'__main__',其中引號(')表明該值為字符串類型。
請記住,在Python中,使用單引號(')和雙引號(")定義的字符串沒有區(qū)別。更多關(guān)于字符串的內(nèi)容請參考Python的基本數(shù)據(jù)類型。
如果在腳本中包含"shebang行"并直接執(zhí)行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,將會(huì)獲取相同的結(jié)果。
您還可以通過向命令行添加-m參數(shù)的方法實(shí)現(xiàn)以模塊的方式執(zhí)行。通常情況下,推薦如下方式pip: python3 -m pip install package_name。
添加-m參數(shù)將會(huì)運(yùn)行包中__main__.py的代碼。更多關(guān)于__main__.py文件的內(nèi)容可參考如何將開源Python包發(fā)布到PyPI中。
在三種情況中,__name__都具有相同的值:字符串'__main__'。
技術(shù)細(xì)節(jié):Python文檔中具體定義了__name__何時(shí)取值為'__main__'。
當(dāng)通過標(biāo)準(zhǔn)輸入,腳本或者交互提示中讀取數(shù)據(jù)時(shí),模塊的__name__將取值為'__main__'。(來源)
__name__與__doc__,__package__和其他屬性一起存儲(chǔ)在模塊的全局命名空間。更多關(guān)于屬性的信息可參考Python數(shù)據(jù)模型文檔,特別是關(guān)于模塊和包的信息,請參閱Python Import文檔。
導(dǎo)入模塊或解釋器
接下來是Python解釋器執(zhí)行代碼的第二種方式:導(dǎo)入。在開發(fā)模塊或腳本時(shí),可以使用import關(guān)鍵字導(dǎo)入他人已經(jīng)構(gòu)建的模塊。
在導(dǎo)入過程中,Python執(zhí)行指定模塊中定義的語句(但僅在第一次導(dǎo)入模塊時(shí))。要演示導(dǎo)入execution_methods.py文件的結(jié)果,需要啟動(dòng)Python解釋器,然后導(dǎo)入execution_methods.py文件:
在此代碼輸出中,Python解釋器執(zhí)行了三次print()函數(shù)調(diào)用。前兩行由于沒有變量,在輸出方面與在命令行上作為腳本執(zhí)行時(shí)完全相同。但是第三個(gè)輸出存在差異。
當(dāng)Python解釋器導(dǎo)入代碼時(shí),__name__的值與要導(dǎo)入的模塊的名稱相同。您可以通過第三行的輸出了解這一點(diǎn)。__name__的值為'execution_methods',是Python導(dǎo)入的.py文件。
注意如果您在沒有退出Python時(shí)再次導(dǎo)入模塊,將不會(huì)有輸出。
注意:更多關(guān)于導(dǎo)入在Python中如何工作的內(nèi)容請參考官方文檔和Python中的絕對和相對導(dǎo)入。
Main函數(shù)的最佳實(shí)踐
既然您已經(jīng)了解兩種執(zhí)行方式上的差異,那么掌握一些最佳實(shí)踐方案還是很有用的。它們將適用于編寫作為腳本運(yùn)行的代碼或者在另一個(gè)模塊導(dǎo)入的代碼。
如下是四種實(shí)踐方式:
將大部分代碼放入函數(shù)或類中
請記住,Python解釋器在導(dǎo)入模塊時(shí)會(huì)執(zhí)行模塊中的所有代碼。有時(shí)如果想要實(shí)現(xiàn)用戶可控的代碼,會(huì)導(dǎo)致一些副作用,例如:
在這種情況下,想要實(shí)現(xiàn)用戶控制觸發(fā)此代碼的執(zhí)行,而不是讓Python解釋器在導(dǎo)入模塊時(shí)執(zhí)行代碼。
因此,最佳方法是將大部分代碼包含在函數(shù)或類中。這是因?yàn)楫?dāng)Python解釋器遇到def或class關(guān)鍵字時(shí),它只存儲(chǔ)這些定義供以后使用,并且在用戶通知之前不會(huì)實(shí)際執(zhí)行。
將如下代碼保存在best_practices.py以證明這個(gè)想法:
在此代碼中,首先從time模塊中導(dǎo)入sleep()。
在這個(gè)示例中,參數(shù)以秒的形式傳入sleep()函數(shù)中,解釋器將暫停一段時(shí)間再運(yùn)行。隨后,使用print()函數(shù)打印關(guān)于代碼描述的語句。
之后,定義一個(gè)process_data()函數(shù),執(zhí)行如下五項(xiàng)操作:
在命令行中執(zhí)行
當(dāng)你將此文件作為腳本用命令行執(zhí)行時(shí)會(huì)發(fā)生什么呢?
Python解釋器將執(zhí)行函數(shù)定義之外的from time import sleep和print(),之后將創(chuàng)建函數(shù)process_data()。然后,腳本將退出而不做任何進(jìn)一步的操作,因?yàn)槟_本沒有任何執(zhí)行process_data()的代碼。
如下是這段腳本的執(zhí)行結(jié)果:
我們在這里看到的輸出是第一個(gè)print()的結(jié)果。注意,從time導(dǎo)入和定義process_data()函數(shù)不產(chǎn)生結(jié)果。具體來說,調(diào)用定義在process_data()內(nèi)部的print()不會(huì)打印結(jié)果。
導(dǎo)入模塊或解釋器執(zhí)行
在會(huì)話(或其他模塊)中導(dǎo)入此文件時(shí),Python解釋器將執(zhí)行相同的步驟。
Python解釋器導(dǎo)入文件后,您可以使用已導(dǎo)入模塊中定義的任何變量,類或函數(shù)。為了證明這一點(diǎn),我們將使用可交互的Python解釋器。啟動(dòng)解釋器,然后鍵入import best_practices:
導(dǎo)入best_practices.py后唯一的輸出來自process_data()函數(shù)外定義的print()。導(dǎo)入模塊或解釋器執(zhí)行與基于命令行執(zhí)行類似。
使用__name__控制代碼的執(zhí)行
如何實(shí)現(xiàn)基于命令行而不使用Python解釋器導(dǎo)入文件來執(zhí)行呢?
您可以使用__name__來決定執(zhí)行上下文,并且當(dāng)__name__等于"__main__"時(shí)才執(zhí)行process_data()。在best_practices.py文件中添加如下代碼:
這段代碼添加了一個(gè)條件語句來檢驗(yàn)__name__的值。當(dāng)值為"__main__"時(shí),條件為True。記住當(dāng)__name__變量的特殊值為"__main__"時(shí)意味著Python解釋器會(huì)執(zhí)行腳本而不是將其導(dǎo)入。
條件語塊內(nèi)添加了四行代碼(第12,13,14和15行):
現(xiàn)在,在命令行中運(yùn)行best_practices.py,并觀察輸出的變化:
首先,輸出顯示了process_data()函數(shù)外的print()的調(diào)用結(jié)果。
之后,data的值被打印。因?yàn)楫?dāng)Python解釋器將文件作為腳本執(zhí)行時(shí),變量__name__具有值"__main__",因此條件語句被計(jì)算為True。
接下來,腳本將調(diào)用process_data()并傳入data進(jìn)行修改。當(dāng)process_data執(zhí)行時(shí),將輸出一些狀態(tài)信息。最終,將輸出modified_data的值。
現(xiàn)在您可以驗(yàn)證從解釋器(或其他模塊)導(dǎo)入best_practices.py后發(fā)生的事情了。如下示例演示了這種情況:
注意,當(dāng)前結(jié)果與將條件語句添加到文件末尾之前相同。因?yàn)榇藭r(shí)__name__變量的值為"best_practices",因此條件語句結(jié)果為False,Python將不執(zhí)行process_data()。
創(chuàng)建名為main()的函數(shù)來包含要運(yùn)行的代碼
現(xiàn)在,您可以編寫作為腳本由從命令行執(zhí)行并導(dǎo)入且沒有副作用的Python代碼。接下來,您將學(xué)習(xí)如何編寫代碼并使其他程序員能輕松地理解其含義。
許多語言,如C,C++,Java以及其他的一些語言,都會(huì)定義一個(gè)叫做main()的函數(shù),當(dāng)編譯程序時(shí),操作系統(tǒng)會(huì)自動(dòng)調(diào)用該函數(shù)。此函數(shù)通常被稱為入口點(diǎn)(entry point),因?yàn)樗浅绦蜻M(jìn)入執(zhí)行的起始位置。
相比之下,Python沒有一個(gè)特殊的函數(shù)作為腳本的入口點(diǎn)。實(shí)際上在Python中可以將入口點(diǎn)定義成任何名稱。
盡管Python不要求將函數(shù)命名為main(),但是最佳的做法是將入口點(diǎn)函數(shù)命名為main()。這樣方便其他程序員定位程序的起點(diǎn)。
此外,main()函數(shù)應(yīng)該包含Python解釋器執(zhí)行文件時(shí)要運(yùn)行的任何代碼。這比將代碼放入條件語塊中更好,因?yàn)橛脩艨梢栽趯?dǎo)入模塊時(shí)重復(fù)使用main()函數(shù)。
修改best_practices.py文件如下所示:
在這個(gè)示例中,定義了一個(gè)main()函數(shù),它包含了上面的條件語句塊。之后修改條件語塊執(zhí)行main()。如果您將此代碼作為腳本運(yùn)行或?qū)耄瑢@得與上一節(jié)相同的輸出。
在main()中調(diào)用其他函數(shù)
另一種常見的實(shí)現(xiàn)方式是在main()中調(diào)用其他函數(shù),而不是直接將代碼寫入main()。這樣做的好處在于可以實(shí)現(xiàn)將幾個(gè)獨(dú)立運(yùn)行的子任務(wù)整合。
例如,某個(gè)腳本有如下功能:
如果在單獨(dú)的函數(shù)中各自實(shí)現(xiàn)這些子任務(wù),您(或其他用戶)可以很容易地實(shí)現(xiàn)代碼重用。之后您可以在main()函數(shù)中創(chuàng)建默認(rèn)的工作流。
您可以根據(jù)自己的情況選擇是否使用此方案。將任務(wù)拆分為多個(gè)函數(shù)會(huì)使重用更容易,但會(huì)增加他人理解代碼的難度。
修改best_practices.py文件如下所示:
在此示例代碼中,文件的前10行具有與之前相同的內(nèi)容。第12行的第二個(gè)函數(shù)創(chuàng)建并返回一些示例數(shù)據(jù),第17行的第三個(gè)函數(shù)模擬將修改后的數(shù)據(jù)寫入數(shù)據(jù)庫。
第21行定義了main()函數(shù)。在此示例中,對main()做出修改,它將調(diào)用數(shù)據(jù)讀取,數(shù)據(jù)處理以及數(shù)據(jù)寫入等功能。
首先,從read_data_from_web()中創(chuàng)建data。將data作為參數(shù)傳入process_data(),之后將返回modified_data。最后,將modified_data傳入write_data_to_database()。
腳本的最后兩行是條件語塊用于驗(yàn)證__name__,并且如果if語句為True,則執(zhí)行main()。
在命令行中運(yùn)行如下所示:
根據(jù)執(zhí)行結(jié)果,Python解釋器在執(zhí)行main()函數(shù)時(shí),將依次執(zhí)行read_data_from_web(),process_data()以及write_data_to_database()。當(dāng)然,您也可以導(dǎo)入best_practices.py文件并重用process_data()作為不同的數(shù)據(jù)輸入源,如下所示:
在此示例中,導(dǎo)入了best_practices并且將其簡寫為bp。
導(dǎo)入過程會(huì)導(dǎo)致Python解釋器執(zhí)行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。
然后,從文件中存儲(chǔ)數(shù)據(jù)而不是從Web中讀取數(shù)據(jù)。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數(shù)。在此情況下,可以利用代碼重寫來取代在main()函數(shù)中實(shí)現(xiàn)全部的代碼邏輯。
實(shí)踐總結(jié)
以下是Python中main()函數(shù)的四個(gè)關(guān)鍵最佳實(shí)踐:
結(jié)論
恭喜!您現(xiàn)在已經(jīng)了解如何創(chuàng)建Python main()函數(shù)了。
本文介紹了如下內(nèi)容:
現(xiàn)在,您可以開始編寫一些非常棒的關(guān)于Python main()函數(shù)代碼啦!
python中定義函數(shù)的關(guān)鍵字是def。
Python使用def關(guān)鍵字開始函數(shù)定義,緊接著是函數(shù)名,括號內(nèi)部為函數(shù)的參數(shù),內(nèi)部為函數(shù)的具體功能實(shí)現(xiàn)代碼,如果想要函數(shù)有返回值, 在expressions中的邏輯代碼中用return返回。
上面我們定義了一個(gè)名字為 function 的函數(shù),函數(shù)沒有不接受參數(shù),所以括號內(nèi)部為空,緊接著就是 函數(shù)的功能代碼。
如果執(zhí)行該腳本,發(fā)現(xiàn)并沒有輸出任何輸出,因?yàn)槲覀冎欢x了函數(shù),而并沒有執(zhí)行函數(shù)。 這時(shí)我們在Python命令提示符中輸入函數(shù)調(diào)用 function(), 注意這里調(diào)用函數(shù)的括號不能省略。
python的學(xué)習(xí)
如果我們用代碼實(shí)現(xiàn)了一個(gè)小功能,但想要在程序代碼中重復(fù)使用,不能在代碼中到處粘貼這些代碼,因?yàn)檫@樣做違反了軟件工程中DRY原則。 Python提供了函數(shù)功能,可以將我們這部分功能抽象成一個(gè)函數(shù)以方便程序調(diào)用,或者提供給其他模塊使用。
函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。(推薦學(xué)習(xí):Python視頻教程)函數(shù)必須先定義,才能調(diào)用,否則會(huì)報(bào)錯(cuò),無參數(shù)時(shí)函數(shù)的調(diào)用函數(shù)名()。
有參數(shù)時(shí)函數(shù)的調(diào),不要在定義函數(shù)的時(shí)候在函數(shù)體里面調(diào)用本身,否則會(huì)出不來,陷入循環(huán)調(diào)用,函數(shù)需要調(diào)用函數(shù)體才會(huì)被執(zhí)行,單純的只是定義函數(shù)是不會(huì)被執(zhí)行的。
Python中的str可以表示字符串類,也可以是將變量強(qiáng)制轉(zhuǎn)換為字符串的函數(shù),寫作str()。str函數(shù)是Python內(nèi)置函數(shù)的一種,可以直接使用,無需調(diào)用。
Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的Guido van Rossum于1990年代初設(shè)計(jì),作為一門叫做ABC語言的替代品。Python提供了高效的高級數(shù)據(jù)結(jié)構(gòu),還能簡單有效地面向?qū)ο缶幊獭?/p>
Python語法和動(dòng)態(tài)類型,以及解釋型語言的本質(zhì),使它成為多數(shù)平臺(tái)上寫腳本和快速開發(fā)應(yīng)用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。
Python解釋器易于擴(kuò)展,可以使用C或C++(或者其他可以通過C調(diào)用的語言)擴(kuò)展新的功能和數(shù)據(jù)類型。Python也可用于可定制化軟件中的擴(kuò)展程序語言。Python豐富的標(biāo)準(zhǔn)庫,提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或機(jī)器碼。