色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python 里最具代表性的符號居然如此強大

Linux愛好者 ? 來源:Python金牌大牛 ? 作者:Python金牌大牛 ? 2021-06-01 15:06 ? 次閱讀

要說 Python 里使用頻率最高的符號,我想下劃線應該排第一吧?

在不同場合下,下劃線有不同含義:比如_var表示內部變量;__var表示私有屬性;__var__表示魔術方法;這些含義有的是程序員群體的約定,如_var;有的是 Python 解釋器規定的形式,如__var。

本文總結 Python 語言編程中常用下劃線的地方,力圖一次搞懂_用法。目前常見的用法有五種:

_用于臨時變量

var_用于解決命名沖突問題

_var用于保護變量

__var用于私有變量

__var__用于魔術方法

下面我們具體看看這些下劃線應用場景。

一、_用于臨時變量

單下劃線一般用于表示臨時變量,在 REPL、for 循環和元組拆包等場景中比較常見。

1.1 REPL單下劃線在 REPL 中關聯的是上一次計算的非 None 結果。

》》》 1+1

2

》》》 _

2

》》》 a=2+2

》》》 _

2

1+1,結果為 2,賦值給_;而賦值表達式a=2+2a 為 4,但整個表達式結果為None,故不會關聯到_。這有點類似日常大家使用的計算器中的ANS按鍵,直接保存了上次的計算結果。

1.2 for循環中的_for 循環中_作為臨時變量用。下劃線來指代沒什么意義的變量。例如在如下函數中,當我們只關心函數執行次數,而不關心具體次序的情況下,可以使用_作為參數

nums = 13

for _ in range(nums):

fun_oper()

1.3 元組拆包中的_第三個用法是元組拆包,賦值的時候可以用_來表示略過的內容。如下代碼忽略北京市人口數,只取得名字和區號。

》》》 city,_,code = (‘Beijing’,21536000,‘010’)

》》》 print(city,code)

Beijing 010

如果需要略過的內容多于一個的話,可以使用*開頭的參數,表示忽略多個內容。如下代碼忽略面積和人口數,只取得名字和區號

city,*_,code = (‘Beijing’,21536000,16410.54,‘010’)

1.4 國際化函數在一些國際化編程中,_常用來表示翻譯函數名。例如 gettext 包使用時:

import gettext

zh = gettext.tranlation(‘dict’,‘locale’,languages=[‘zh_CN’])

zh.install()

_(‘hello world’)

依據設定的字典文件,其返回相應的漢字“你好世界”。

1.5 大數字表示形式_也可用于數字的分割,這在數字比較長的時候常用。

》》》 a = 9_999_999_999

》》》 a

9999999999

a 的值自動忽略了下劃線。這樣用_分割數字,有利于便捷讀取比較大的數。

二、var_用于解決命名沖突問題

變量后面加一個下劃線。主要用于解決命名沖突問題,元編程中遇時 Python 保留的關鍵字時,需要臨時創建一個變量的副本時,都可以使用這種機制。

def type_obj_class(name,class_):

pass

def tag(name,*content,class_):

pass

以上代碼中出現的class是 Python 的保留關鍵字,直接使用會報錯,使用下劃線后綴的方式解決了這個問題。

三、_var用于保護變量

前面一個下劃線,后面加上變量,這是僅供內部使用的“保護變量”。比如函數、方法或者屬性。

這種保護不是強制規定,而是一種程序員的約定,解釋器不做訪問控制。一般來講這些屬性都作為實現細節而不需要調用者關心,隨時都可能改變,我們編程時雖然能訪問,但是不建議訪問。

這種屬性,只有在導入時,才能發揮保護作用。而且必須是from XXX import *這種導入形式才能發揮保護作用。

使用from XXX import *是一種通配導入(wildcard import),這是 Python 社區不推薦的方式,因為你根本搞不清你到底導入了什么屬性、方法,很可能搞亂你自己的命名空間。PEP8推薦的導入方式是from XXX import aVar , b_func , c_func這種形式。

比如在下例汽車庫函數 tools.py 里定義的“保護屬性”:發動機型號和輪胎型號,這屬于實現細節,沒必要暴露給用戶。當我們使用 from tools import * 語句調用時,其實際并沒有導入所有_開頭的屬性,只導入了普通 drive 方法。

_moto_type = ‘L15b2’

_wheel_type = ‘michelin’

def drive():

_start_engine()

_drive_wheel()

def _start_engine():

print(‘start engine %s’%_moto_type)

def _drive_wheel():

print(‘drive wheel %s’%_wheel_type)

查看命令空間print(vars())可見,只有 drive 函數被導入進來,其他下劃線開頭的“私有屬性”都沒有導入進來。

{‘__name__’: ‘__main__’, ‘__doc__’: None, ‘__package__’: None, ‘__loader__’: 《_frozen_importlib_external.SourceFileLoader object at 0x005CF868》, ‘__spec__’: None, ‘__annotations__’:{}, ‘__builtins__’: 《module ‘builtins’ (built-in)》, ‘__file__’: ‘。\xiahuaxian.py’, ‘__cached__’: None, ‘walk’: 《function walk at 0x01DA8C40》, ‘root’: ‘。\__pycache__’, ‘_’: [21536000, 16410.54], ‘dirs’: [‘tools.cpython-38.pyc’], ‘city’: ‘Beijing’, ‘code’: ‘010’, ‘drive’: 《function drive at 0x01DBC4A8》}

3.1 突破保護屬性之所以說是“保護”并不是“私有”,是因為 Python 沒有提供解釋器機制來控制訪問權限。我們依然可以訪問這些屬性:

import tools

tools._moto_type = ‘EA211’

tools.drive()

以上代碼,以越過“保護屬性”。此外,還有兩種方法能突破這個限制,一種是將“私有屬性”添加到 tool.py 文件的 __all__ 列表里,使from tools import *也導入這些本該隱藏的屬性。

__all__ = [‘drive’,‘_moto_type’,‘_wheel_type’]

另一種是導入時指定“受保護屬性”名。

from tools import drive,_start_engine

_start_engine()

甚至是,使用import tools也可以輕易突破保護限制。所以可見,“保護屬性”是一種簡單的隱藏機制,只有在from tools import *時,由解釋器提供簡單的保護,但是可以輕易突破。這種保護更多地依賴程序員的共識:不訪問、修改“保護屬性”。除此之外,有沒有更安全的保護機制呢?有,就是下一部分討論的私有變量。

四、__var用于私有變量

私有屬性解決的之前的保護屬性保護力度不夠的問題。變量前面加上兩個下劃線,類里面作為屬性名和方法都可以。兩個下劃線屬性由 Python 的改寫機制來實現對這個屬性的保護。

看下面汽車例子中,品牌為普通屬性,發動機為“保護屬性”,車輪品牌為“私有屬性”。

class Car:

def __init__(self):

self.brand = ‘Honda’

self._moto_type = ‘L15B2’

self.__wheel_type = ‘michelin’

def drive(self):

print(‘Start the engine %s,drive the wheel %s,I get a running %s car’%

(self._moto_type,

self.__wheel_type,

self.brand))

我們用var(car1)查看下具體屬性值,

[‘_Car__wheel_type’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__init_subclass__’, ‘__le__’, ‘__lt__’, ‘__module__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’, ‘_moto_type’, ‘brand’, ‘drive’]

可見,實例化 car1 中,普通屬性 self.brand 和保護屬性 self._moto_type 都得以保存,兩個下劃線的私有屬性 __wheel_type 沒有了。取而代之的是_Car_wheel_type這個屬性。這就是改寫機制(Name mangling)。兩個下劃線的屬性,被改寫成帶有類名前綴的變量,這樣子類很難明明一個和如此復雜名字重名的屬性。保證了屬性不被重載,保證了其的私有性。

4.1 突破私有屬性這里“私有變量”的實現,是從解釋器層面給與的改寫,保護了私有變量。但是這個機制并非絕對安全,因為我們依然可以通過 obj._ClasssName__private 來訪問 __private 私有屬性。

car1.brand = ‘Toyota’

car1._moto_type = ‘6AR-FSE’

car1._Car__wheel_type = ‘BRIDGESTONE’

car1.drive()

結果

Start the engine 6AR-FSE,

drive the wheel BRIDGESTONE,

I get a running Toyota car

可見,對改寫機制改寫的私有變量,雖然保護性加強了,但依然可以訪問并修改。只是這種修改,只是一種雜耍般的操作,并不可取。

五、__var__用于魔術方法

變量前面兩個下劃線,后面兩個下劃線。這是 Python 當中的魔術方法,一般是給系統程序調用的。例如上例中的 __init__ 就是類的初始化魔術方法,還有支持 len 函數的 __len__ 方法,支持上下文管理器協議的 __enter__ 和 __exit__ 方法,支持迭代器協議的 __iter__ 方法,支持格式化顯示的 __repr__ 和 __str__ 方法等等。這里我們為上例的 Car 類添加魔術方法 __repr__ 來支持格式化顯示。

def __repr__(self):

return ‘***Car %s:with %s Engine,%sWheel***’%

(self.brand,self._moto_type,self.__wheel_type)

未添加__repr__魔術方法之前,print(car1)結果為《__main__.Car object at 0x0047F7F0》,這個結果讓人看的一頭霧水,增加 repr 魔術方法之后,顯示結果為***Car Toyota:with 6AR-FSE Engine,BRIDGESTONE Wheel***清晰明了,利于調試。這就是魔術方法的功效:支持系統調用,改進用戶類表現,增加協議支持,使用戶類表現得更像系統類。

5.1 Python魔術方法分類以下所有魔術方法均需要在前后加上__,這里省略了這些雙下劃線。

一元運算符 neg pos abs invert

轉換 complex int float round inex

算術運算 add sub mul truediv floordiv mod divmod pow lshift rshift and xor or

算術運算除 and 之外,前面再加上 r,表示反運算。除 dimod 外,前面加上 i,表示就地運算。

比較 lt le eq ne gt ge

類屬性 getattr getattribute setattr delattr dir get set delete

格式化 bytes hash bool format

類相關 init del new

列表 getitem

迭代器 iter next

上下文管理器 enter exit

六、總結

總之,下劃線在 Python 當中應用還是很廣泛的,甚至可以說 Python 對下劃線有所偏愛。可以看到 _常用于臨時變量,在 REPL,for 循環,元組拆包和國際化中得到了廣泛應用。var_用于解決命名沖突問題,使用時比較簡單易懂的。

_var對變量的保護,只是一種脆弱的保護,更多依靠程序員的約定。__var用于私有變量,借助改寫機制支持,已經支持了私有變量,但是仍然存在漏洞。對__var__用于魔術方法,進行了一個簡單的介紹,魔術方法較多,但是理解并不復雜。希望以后可以進一步介紹這些魔術方法。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4800

    瀏覽量

    84820
  • 解釋器
    +關注

    關注

    0

    文章

    103

    瀏覽量

    6543

原文標題:Python 里最具代表性的符號,竟如此強大

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    芯盾時代入選《API安全技術應用指南(2024版)》API安全十大代表性廠商

    的零信任業務安全產品方案提供商,憑借在API安全領域領先的產品方案、豐富的實踐經驗和優秀的市場表現,成功入選“API安全領域十大代表性廠商”。 安全牛點評 ? 芯盾時代API安全能力 1.基于API安全能力,持續深耕于業務安全,進一步加強了客戶信
    的頭像 發表于 12-18 11:04 ?353次閱讀
    芯盾時代入選《API安全技術應用指南(2024版)》API安全十大<b class='flag-5'>代表性</b>廠商

    邏輯異或運算符在Python中的用法

    Python中的 ^ 符號實際上是一個按位異或運算符,用于對整數的二進制表示進行異或操作。 盡管如此,我們仍然可以通過一些方法來實現邏輯異或的功能,即當兩個布爾值不同時為真,相同時為假。這可以通過使用邏輯運算符來實現,而不是直
    的頭像 發表于 11-19 09:46 ?232次閱讀

    全國5G新基建智慧燈桿建設十大代表性案例

    全國5G新基建智慧燈桿建設十大代表性案例
    的頭像 發表于 11-07 12:50 ?660次閱讀
    全國5G新基建智慧燈桿建設十大<b class='flag-5'>代表性</b>案例

    Python常用函數大全

    Python 世界,有一些寶藏函數和模塊,它們可以讓你編程更輕松、代碼更高效。這篇文章將帶你一一認識這些神器,讓你的開發生活瞬間輕松不少!
    的頭像 發表于 10-27 17:20 ?290次閱讀

    第二屆大會回顧第25期 | OpenHarmony上的Python設備應用開發

    Python以其簡單、易學和功能強大而聞名,有著廣泛的用戶群體。采用Python開發有助于降低OpenHarmony的學習門檻。如何在OpenHarmony上用Python開發設備應用
    的頭像 發表于 08-27 11:53 ?740次閱讀
    第二屆大會回顧第25期 | OpenHarmony上的<b class='flag-5'>Python</b>設備應用開發

    使用Python批量連接華為網絡設備

    隨著網絡規模的擴大和設備數量的增加,手動配置和管理每臺網絡設備變得越來越不現實。因此,自動化工具和腳本變得尤為重要。Python語言以其簡潔強大的第三方庫支持,成為了網絡自動化領域的首選。本篇文章將詳細介紹如何使用
    的頭像 發表于 08-12 17:48 ?493次閱讀

    pytorch和python的關系是什么

    在當今的人工智能領域,Python已經成為了最受歡迎的編程語言之一。Python的易學易用、豐富的庫和框架以及強大的社區支持,使其成為了數據科學、機器學習和深度學習等領域的首選語言。而在深度學習領域
    的頭像 發表于 08-01 15:27 ?2089次閱讀

    Python建模算法與應用

    Python作為一種功能強大、免費、開源且面向對象的編程語言,在科學計算、數學建模、數據分析等領域展現出了卓越的性能。其簡潔的語法、對動態輸入的支持以及解釋語言的本質,使得Python
    的頭像 發表于 07-24 10:41 ?586次閱讀

    如何使用Python進行神經網絡編程

    。 為什么使用PythonPython是一種廣泛使用的高級編程語言,以其易讀和易用而聞名。Python擁有
    的頭像 發表于 07-02 09:58 ?423次閱讀

    Python自動化測試框架及其應用

    Pytest是一個非常成熟的全功能的Python測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,功能更強大
    的頭像 發表于 04-03 16:15 ?568次閱讀
    <b class='flag-5'>Python</b>自動化測試框架及其應用

    常用的電氣元件符號有哪些?

    以上是一些常見的電氣元件符號,它們在電路圖和設計中起著至關重要的作用。通過使用標準化的電氣元件符號,可以確保電路圖的準確和可靠,從而提高工程設計的效率和質量。
    的頭像 發表于 04-01 13:24 ?2118次閱讀

    小白請問電路這兩個半圓代表什么?

    請問電路這兩個半圓代表什么元件? 沒有搜到呀。 另外,請問下圖中的3.3v 電源是不是都要接到一起. 謝謝
    發表于 02-16 16:32

    德國傳感器的實力,為什么如此強大

    這里 關注我, 記得點右上角菜單欄? ? ?鍵設為星標 ? ? ? 我們談起德國,想到的就是德國強大的工業實力,以及大眾、奔馳、西門子等等巨頭。 ? 然而,這些只是冰山一角,德國的工業實力有一半以上
    的頭像 發表于 02-02 17:20 ?908次閱讀
    德國傳感器的實力,為什么<b class='flag-5'>如此</b><b class='flag-5'>強大</b>?

    如何使用linux下gdb來調試python程序

    如何使用linux下gdb來調試python程序? 在Linux下,可以使用GDB(GNU調試器)來調試Python程序。GDB是一個強大的調試工具,可以幫助開發者診斷和修復程序中的錯誤。在本文
    的頭像 發表于 01-31 10:41 ?2667次閱讀

    如何解決Python爬蟲中文亂碼問題?Python爬蟲中文亂碼的解決方法

    Python爬蟲中文亂碼問題。 一、了解字符編碼 在解決亂碼問題之前,我們首先需要了解一些基本的字符編碼知識。常見的字符編碼有ASCII、UTF-8和GBK等。 1. ASCII:是一種用于表示英文字母、數字和常用符號的字符編碼,它使用一個字節(8位)來表示一個字符。
    的頭像 發表于 01-12 15:11 ?2474次閱讀
    主站蜘蛛池模板: 好男人好资源在线播放| 无码日本亚洲一区久久精品| 一个人看的www视频动漫版| 看了n遍舍不得删的黄文| 99久久精品一区二区三区| 日本中文一区| 国产午夜精品美女免费大片| 亚洲一二三产品区别在哪里| 嗯啊…跟校草在教室里做h| 高傲教师麻麻被同学调教123| 亚洲精品久久久992KVTV| 美女厕所撒尿ass| 岛国在线永久免费视频| 亚洲欧美高清在线| 暖暖 免费 日本 高清 在线1| 国产免国产免费| 4k岛国精品午夜高清在线观看| 少妇邻居内射在线| 噜噜噜狠狠夜夜躁| 国产精品色吧国产精品| 5566精品资源在线播放| 乌克兰黄色录像| 内射白浆一区二区在线观看| 国语大学生自产拍在线观看| 99热这里有精品| 亚洲在线视频自拍精品| 色欲AV亚洲永久无码精品麻豆| 久久亚洲精品中文字幕| 国产精品路线1路线2路线| 99久久蜜臀AV免费看蛮| 亚洲人成网站7777视频| 色一伦一情一区二区三区| 美女胸网站| 精品久久中文字幕有码| 国产激情视频在线| BLACKED太粗太长| 优优色影院| 亚洲精品成人无码区一在线观看| 日本三级床震| 免费可以看黄的视频s色| 韩国甜性涩爱|