pythonwithimport
A. python導入模塊的方法有哪些
方法一
import modname
模塊是指一個可以交互使用,或者從另一Python 程序訪問的代碼段。只要導入了一個模塊,就可以引用它的任何公共的函數、類或屬性。模塊可以通過這種方法來使用其它模塊的功能。
用import語句導入模塊,就在當前的名稱空間(namespace)建立了一個到該模塊的引用.這種引用必須使用全稱,也就是說,當使用在被導入模塊中定義的函數時,必須包含模塊的名字。所以不能只使用 funcname,而應該使用 modname.funcname
方法二
from modname import funcname
from modname import fa, fb, fc
或者
from modname import *
與第1種方法的區別:funcname 被直接導入到本地名字空間去了,所以它可以直接使用,而不需要加上模塊名的限定* 表示,該模塊的所有公共對象(public objects)都被導入到 當前的名稱空間,也就是任何只要不是以」_」開始的東西都會被導入。
modname沒有被定義,所以modname.funcname這種方式不起作用。並且,如果funcname如果已經被定義,它會被新版本(該導入模塊中的版本)所替代。如果funcname被改成指向其他對象,modname不能不會覺察到。
建議:
1)如果你要經常訪問模塊的屬性和方法,且不想一遍又一遍地敲入模塊名,使用 from mole import
2)如果你想要有選擇地導入某些屬性和方法,而不想要其它的,使用 from mole import
3)如果模塊包含的屬性和方法與你的某個模塊同名,你必須使用import mole來避免名字沖突
4)盡量少用 from mole import * ,因為判定一個特殊的函數或屬性是從哪來的有些困難,並且會造成調試和重構都更困難。
方法三
內建函數__import__()
除了前面兩種使用import關鍵字的方法以外,我們還可以使用內建函數 __import__() 來導入 mole。兩者的區別是,import 後面跟的必須是一個類型(type),而__import__() 的參數是一個字元串,這個字元串可能來自配置文件,也可能是某個表達式計算結果。例如:
mymole = __import__ (』mole_name』)
附註:
1)模塊的內容都放在一個模塊文件中,如 mymole 的內容應該放在PYTHONPATH 目錄下的一個mymole.py中,C實現的除外
2)包可以將幾個模塊名稱空間組織起來, 如A.b 就表示在包A中的一個子模塊b
可以單獨導入某一個子模塊,如Python文檔中給出的例子
import sound.effects.echo
這樣必須使用全稱對裡面的對象進行引用,如
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
還可以使用下面的語句來載入echo子模塊
from Sound.Effects import echo
它在沒有包前綴的情況下也可以使用, 所以它可以如下方式調用:
echo.echofilter(input, output, delay=0.7, atten=4)
不主張從一個包或模塊中用import * 導入所有模塊,因為這樣的通常會導致可讀性很差。
from Package import specific_submole的用法並沒有錯,實際上這還是推薦的用法,除非導入的模塊需要使用其它包中的同名子模塊(the importing mole needs to use submoles with the same name from different packages).
綜上所述,一般情況應該使用import , 但有幾個例外
1)mole文檔告訴你要用from-import的
2)導入一個包組件。需要一個包裡面的某個子模塊,一般用from A.b import c比import A.b.c 更方便 且不會冒混淆的危險.
B. Python有哪些語句
編程語言有那些它就那些
列印輸出
判斷分支
邏輯運算。
C. Python 有什麼奇技淫巧
Python奇技淫巧
當發布python第三方package時, 並不希望代碼中所有的函數或者class可以被外部import, 在 __init__.py 中添加 __all__ 屬性,
該list中填寫可以import的類或者函數名, 可以起到限制的import的作用, 防止外部import其他函數或者類
#!/usr/bin/env python
# -*- coding: utf-8 -*-
frombaseimportAPIBase
fromclientimportClient
fromdecoratorimportinterface, export, stream
fromserverimportServer
fromstorageimportStorage
fromutilimport(LogFormatter, disable_logging_to_stderr,
enable_logging_to_kids, info)
__all__ = ['APIBase','Client','LogFormatter','Server',
'Storage','disable_logging_to_stderr','enable_logging_to_kids',
'export','info','interface','stream']
with的魔力
with語句需要支持 上下文管理協議的對象 , 上下文管理協議包含 __enter__ 和 __exit__ 兩個方法. with語句建立運行時上下文需要通過這兩個方法執行 進入和退出 操作.
其中 上下文表達式 是跟在with之後的表達式, 該表示大返回一個上下文管理對象
# 常見with使用場景
withopen("test.txt","r")asmy_file:# 注意, 是__enter__()方法的返回值賦值給了my_file,
forlineinmy_file:
print line
詳細原理可以查看這篇文章, 淺談 Python 的 with 語句
知道具體原理, 我們可以自定義支持上下文管理協議的類, 類中實現 __enter__ 和 __exit__ 方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
classMyWith(object):
def__init__(self):
print"__init__ method"
def__enter__(self):
print"__enter__ method"
returnself# 返回對象給as後的變數
def__exit__(self, exc_type, exc_value, exc_traceback):
print"__exit__ method"
ifexc_tracebackisNone:
print"Exited without Exception"
returnTrue
else:
print"Exited with Exception"
returnFalse
deftest_with():
withMyWith()asmy_with:
print"running my_with"
print"------分割線-----"
withMyWith()asmy_with:
print"running before Exception"
raiseException
print"running after Exception"
if__name__ =='__main__':
test_with()
執行結果如下:
__init__ method
__enter__ method
running my_with
__exit__ method
ExitedwithoutException
------分割線-----
__init__ method
__enter__ method
running before Exception
__exit__ method
ExitedwithException
Traceback(most recent call last):
File"bin/python", line34,in<mole>
exec(compile(__file__f.read(), __file__, "exec"))
File"test_with.py", line33,in<mole>
test_with()
File"test_with.py", line28,intest_with
raiseException
Exception
證明了會先執行 __enter__ 方法, 然後調用with內的邏輯, 最後執行 __exit__ 做退出處理, 並且, 即使出現異常也能正常退出
filter的用法
相對 filter 而言, map和rece使用的會更頻繁一些, filter 正如其名字, 按照某種規則 過濾 掉一些元素
#!/usr/bin/env python
# -*- coding: utf-8 -*-
lst = [1,2,3,4,5,6]
# 所有奇數都會返回True, 偶數會返回False被過濾掉
print filter(lambda x: x % 2!=0, lst)
#輸出結果
[1,3,5]
一行作判斷
當條件滿足時, 返回的為等號後面的變數, 否則返回else後語句
lst = [1,2,3]
new_lst = lst[0]iflstisnotNoneelseNone
printnew_lst
# 列印結果
1
裝飾器之單例
使用裝飾器實現簡單的單例模式
# 單例裝飾器
defsingleton(cls):
instances = dict() # 初始為空
def_singleton(*args, **kwargs):
ifclsnotininstances:#如果不存在, 則創建並放入字典
instances[cls] = cls(*args, **kwargs)
returninstances[cls]
return_singleton
@singleton
classTest(object):
pass
if__name__ =='__main__':
t1 = Test()
t2 = Test()
# 兩者具有相同的地址
printt1, t2
staticmethod裝飾器
類中兩種常用的裝飾, 首先區分一下他們
普通成員函數, 其中第一個隱式參數為 對象
classmethod裝飾器 , 類方法(給人感覺非常類似於OC中的類方法), 其中第一個隱式參數為 類
staticmethod裝飾器 , 沒有任何隱式參數. python中的靜態方法類似與C++中的靜態方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
classA(object):
# 普通成員函數
deffoo(self, x):
print "executing foo(%s, %s)"% (self, x)
@classmethod# 使用classmethod進行裝飾
defclass_foo(cls, x):
print "executing class_foo(%s, %s)"% (cls, x)
@staticmethod# 使用staticmethod進行裝飾
defstatic_foo(x):
print "executing static_foo(%s)"% x
deftest_three_method():
obj = A()
# 直接調用噗通的成員方法
obj.foo("para")# 此處obj對象作為成員函數的隱式參數, 就是self
obj.class_foo("para")# 此處類作為隱式參數被傳入, 就是cls
A.class_foo("para")#更直接的類方法調用
obj.static_foo("para")# 靜態方法並沒有任何隱式參數, 但是要通過對象或者類進行調用
A.static_foo("para")
if__name__=='__main__':
test_three_method()
# 函數輸出
executing foo(<__main__.Aobject at0x100ba4e10>, para)
executing class_foo(<class'__main__.A'>,para)
executing class_foo(<class'__main__.A'>,para)
executing static_foo(para)
executing static_foo(para)
property裝飾器
定義私有類屬性
將 property 與裝飾器結合實現屬性私有化( 更簡單安全的實現get和set方法 )
#python內建函數
property(fget=None, fset=None, fdel=None, doc=None)
fget 是獲取屬性的值的函數, fset 是設置屬性值的函數, fdel 是刪除屬性的函數, doc 是一個字元串(like a comment).從實現來看,這些參數都是可選的
property有三個方法 getter() , setter() 和 delete() 來指定fget, fset和fdel。 這表示以下這行
classStudent(object):
@property #相當於property.getter(score) 或者property(score)
defscore(self):
returnself._score
@score.setter #相當於score = property.setter(score)
defscore(self, value):
ifnotisinstance(value, int):
raiseValueError('score must be an integer!')
ifvalue <0orvalue >100:
raiseValueError('score must between 0 ~ 100!')
self._score = value
iter魔法
通過yield和 __iter__ 的結合, 我們可以把一個對象變成可迭代的
通過 __str__ 的重寫, 可以直接通過想要的形式列印對象
#!/usr/bin/env python
# -*- coding: utf-8 -*-
classTestIter(object):
def__init__(self):
self.lst = [1,2,3,4,5]
defread(self):
foreleinxrange(len(self.lst)):
yieldele
def__iter__(self):
returnself.read()
def__str__(self):
return','.join(map(str, self.lst))
__repr__ = __str__
deftest_iter():
obj = TestIter()
fornuminobj:
printnum
printobj
if__name__ =='__main__':
test_iter()
神奇partial
partial使用上很像C++中仿函數(函數對象).
在stackoverflow給出了類似與partial的運行方式
defpartial(func, *part_args):
defwrapper(*extra_args):
args = list(part_args)
args.extend(extra_args)
returnfunc(*args)
returnwrapper
利用用閉包的特性綁定預先綁定一些函數參數, 返回一個可調用的變數, 直到真正的調用執行
#!/usr/bin/env python
# -*- coding: utf-8 -*-
fromfunctoolsimportpartial
defsum(a, b):
returna + b
deftest_partial():
fun = partial(sum, 2)# 事先綁定一個參數, fun成為一個只需要一個參數的可調用變數
printfun(3)# 實現執行的即是sum(2, 3)
if__name__ =='__main__':
test_partial()
# 執行結果
5
神秘eval
eval我理解為一種內嵌的python解釋器(這種解釋可能會有偏差), 會解釋字元串為對應的代碼並執行, 並且將執行結果返回
看一下下面這個例子
#!/usr/bin/env python
# -*- coding: utf-8 -*-
deftest_first():
return3
deftest_second(num):
returnnum
action = { # 可以看做是一個sandbox
"para":5,
"test_first": test_first,
"test_second": test_second
}
deftest_eavl():
condition = "para == 5 and test_second(test_first) > 5"
res = eval(condition, action) # 解釋condition並根據action對應的動作執行
printres
if__name__ =='_
exec
exec在Python中會忽略返回值, 總是返回None, eval會返回執行代碼或語句的返回值
exec 和 eval 在執行代碼時, 除了返回值其他行為都相同
在傳入字元串時, 會使用 compile(source, '<string>', mode) 編譯位元組碼. mode的取值為 exec 和 eval
#!/usr/bin/env python
# -*- coding: utf-8 -*-
deftest_first():
print"hello"
deftest_second():
test_first()
print"second"
deftest_third():
print"third"
action = {
"test_second": test_second,
"test_third": test_third
}
deftest_exec():
exec"test_second"inaction
if__name__ =='__main__':
test_exec() # 無法看到執行結果
getattr
getattr(object, name[, default]) Return the value of
the named attribute of object. name must be a string. If the string is
the name of one of the object』s attributes, the result is the value of
that attribute. For example, getattr(x, 『foobar』) is equivalent to
x.foobar. If the named attribute does not exist, default is returned if
provided, otherwise AttributeError is raised.
通過string類型的name, 返回對象的name屬性(方法)對應的值, 如果屬性不存在, 則返回默認值, 相當於object.name
# 使用範例
classTestGetAttr(object):
test = "test attribute"
defsay(self):
print"test method"
deftest_getattr():
my_test = TestGetAttr()
try:
printgetattr(my_test,"test")
exceptAttributeError:
print"Attribute Error!"
try:
getattr(my_test, "say")()
exceptAttributeError:# 沒有該屬性, 且沒有指定返回值的情況下
print"Method Error!"
if__name__ =='__main__':
test_getattr()
# 輸出結果
test attribute
test method
命令行處理
defprocess_command_line(argv):
"""
Return a 2-tuple: (settings object, args list).
`argv` is a list of arguments, or `None` for ``sys.argv[1:]``.
"""
ifargvisNone:
argv = sys.argv[1:]
# initialize the parser object:
parser = optparse.OptionParser(
formatter=optparse.TitledHelpFormatter(width=78),
add_help_option=None)
# define options here:
parser.add_option( # customized description; put --help last
'-h','--help', action='help',
help='Show this help message and exit.')
settings, args = parser.parse_args(argv)
# check number of arguments, verify values, etc.:
ifargs:
parser.error('program takes no command-line arguments; '
'"%s" ignored.'% (args,))
# further process settings & args if necessary
returnsettings, args
defmain(argv=None):
settings, args = process_command_line(argv)
# application code here, like:
# run(settings, args)
return0# success
if__name__ =='__main__':
status = main()
sys.exit(status)
讀寫csv文件
# 從csv中讀取文件, 基本和傳統文件讀取類似
importcsv
withopen('data.csv','rb')asf:
reader = csv.reader(f)
forrowinreader:
printrow
# 向csv文件寫入
importcsv
withopen('data.csv','wb')asf:
writer = csv.writer(f)
writer.writerow(['name','address','age'])# 單行寫入
data = [
( 'xiaoming ','china','10'),
( 'Lily','USA','12')]
writer.writerows(data) # 多行寫入
各種時間形式轉換
只發一張網上的圖, 然後差文檔就好了, 這個是記不住的
字元串格式化
一個非常好用, 很多人又不知道的功能
>>>name ="andrew"
>>>"my name is {name}".format(name=name)
'my name is andrew'
D. 這些python操作符都是什麼意思或作用
其實,你就是對於基礎知識,不了解而已。
相關的一些基礎知識,也許對你有用:
【整理】Python語言簡介
【教程】如何下載最新版的,各種版本的,包括Python 2.x和Python 3.x的Python
【教程】如何在Windows系統中安裝Python
【整理】【多圖詳解】如何在Windows下開發Python:在cmd下運行Python腳本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE
等等等。。。
比如你要的模塊方面的:
【教程】Python中的內置的模塊 和第三方的模塊
【待完善】【總結】Python安裝第三方的庫、package的方法
【已解決】Python中導入子文件夾中的模塊
其他的不多說了,都整理到這里了,需要的話,自己去看吧:
【教程】Python開發入門詳解
而另外,中級的,開發過程中有關的,都在這里:
【整理】Python開發過程中相關方面的知識
都看完,基本上就算懂了不少了。
剩下的,主要還是要靠你自己多練習。
(此處不給貼地址,請自己用google搜帖子標題,即可找到帖子地址)
E. python如何通過變數import其他文件夾的py文件
在被import py文件的文件夾中建立一個空的__init__.py文件