日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 的运算符

發(fā)布時間:2025/3/21 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 的运算符 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
請注意,凡是在源代碼文件中使用了中文字符,請最好保存為utf-8格式 參與運算的兩個值,如果兩個相應位相同,則結(jié)果為0,否則為1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0 例如:10100001^00010001=10110000 0^0=0,0^1=1 0異或任何數(shù)=任何數(shù) 1^0=1,1^1=0 1異或任何數(shù)-任何數(shù)取反 任何數(shù)異或自己=把自己置0 (1)按位異或可以用來使某些特定的位翻轉(zhuǎn),如對數(shù)10100001的第2位和第3位翻轉(zhuǎn),可以將數(shù)與00000110進行按位異或運算。           10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6 (2)通過按位異或運算,可以實現(xiàn)兩個值的交換,而不必使用臨時變量。例如交換兩個整數(shù)a,b的值,可通過下列語句實現(xiàn): a=10100001,b=00000110 a=a^b;   //a=10100111 b=b^a;   //b=10100001 a=a^b;   //a=00000110 (3)異或運算符的特點是:數(shù)a兩次異或同一個數(shù)b(a=a^b^b)仍然為原值a. 本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/kybd2006/archive/2009/01/07/3727218.aspx 1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相與。只有對應的兩個二進位均為1時,結(jié)果位才為1 ,否則為0。參與運算的數(shù)以補碼方式出現(xiàn)。 例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數(shù)為0000000011111111)。 應用: a. 清零特定位 (mask中特定位置0,其它位為1,s=s&mask) b. 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask) 2. 按位或運算 按位或運算符“|”是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相或。只要對應的二個二進位有一個為1時,結(jié)果位就為1。參與運算的兩個數(shù)均以補碼出現(xiàn)。 例如:9|5可寫算式如下: 00001001|00000101 00001101 (十進制為13)可見9|5=13 應用: 常用來將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask) 3. 按位異或運算 按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相異或,當兩對應的二進位相異時,結(jié)果為1。參與運算數(shù)仍以補碼出現(xiàn),例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12) 應用: a. 使特定位的值取反 (mask中特定位置1,其它位為0 s=s^mask) b. 不引入第三變量,交換兩個變量的值 (設 a=a1,b=b1) 目 標 操 作 操作后狀態(tài) a=a1^b1 a=a^b a=a1^b1,b=b1 b=a1^b1^b1 b=a^b a=a1^b1,b=a1 a=b1^a1^a1 a=a^b a=b1,b=a1 4. 求反運算 求反運算符~為單目運算符,具有右結(jié)合性。 其功能是對參與運算的數(shù)的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結(jié)果為:1111111111110110 5. 左移運算 左移運算符“<<”是雙目運算符。其功能把“<< ”左邊的運算數(shù)的各二進位全部左移若干位,由“<<”右邊的數(shù)指定移動的位數(shù), 高位丟棄,低位補0。 其值相當于乘2。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位后為00110000(十進制48)。 6. 右移運算 右移運算符“>>”是雙目運算符。其功能是把“>> ”左邊的運算數(shù)的各二進位全部右移若干位,“>>”右邊的數(shù)指定移動的位數(shù)。其值相當于除2。 例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。對于左邊移出的空位,如果是正數(shù)則空位補0,若為負數(shù),可能補0或補1,這取決于所用的計算機系統(tǒng)。移入0的叫邏輯右移,移入1的叫算術(shù)右移,Turbo C采用邏輯右移。 main(){ unsigned a,b; printf("input a number: "); scanf("%d",&a); b=a>>5; b=b&15; printf("a=%d b=%d ",a,b); } 再看一例: main(){ char a='a',b='b'; int p,c,d; p=a; p=(p<<8)|b; d=p&0xff; c=(p&0xff00)>>8; printf("a=%d b=%d c=%d d=%d ",a,b,c,d); } 浮點數(shù)的存儲格式: 浮點數(shù)的存儲格式是符號+階碼(定點整數(shù))+尾數(shù)(定點小數(shù)) SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM 即1位符號位(0為正,1為負),8位指數(shù)位,23位尾數(shù)位 浮點數(shù)存儲前先轉(zhuǎn)化成2的k次方形式,即: f = A1*2^k + A2*2^(k-1) + ... + Ak +... +An*2^(-m) (Ai = {0, 1}, A1 = 1) 如5.5=2^2 + 2^0 + 2^(-1) 其中的k就是指數(shù),加127后組成8位指數(shù)位 5.5的指數(shù)位就是2+127 = 129 = 10000001 A2A3.....An就是尾數(shù)位,不足23位后補0 所以5.5 = 01000000101000000000000000000000 = 40A00000 所以,對浮點數(shù)*2、/2只要對8位符號位+、- 即可,但不是左移、右移 關(guān)于unsigned int 和 int 的在位運算上的不同,下面有個CU上的例子描述的很清楚: [問題]:這個函數(shù)有什么問題嗎? /** * 本函數(shù)將兩個16比特位的值連結(jié)成為一個32比特位的值。 * 參數(shù):sHighBits 高16位 * sLowBits 低16位 * 返回:32位值 **/ long CatenateBits16(short sHighBits, short sLowBits) { long lResult = 0; /* 32位值的臨時變量*/ /* 將第一個16位值放入32位值的高16位 */ lResult = sHighBits; lResult <<= 16; /* 清除32位值的低16位 */ lResult &= 0xFFFF0000; /* 將第二個16位值放入32位值的低16位 */ lResult |= (long)sLowBits; return lResult; } / [問題的發(fā)現(xiàn)]: 我們先看如下測試代碼: / int main() { short sHighBits1 = 0x7fff; short sHighBits2 = 0x8f12; unsigned short usHighBits3 = 0xff12; short sLowBits1 = 0x7bcd; long lResult = 0; printf("[sHighBits1 + sLowBits1] "; lResult = CatenateBits16(sHighBits1, sLowBits1); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(sHighBits2, sLowBits1); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(usHighBits3, sLowBits1); printf("lResult = %08x ", lResult, lResult); } / 運行結(jié)果為: [sHighBits1 + sLowBits1] lResult = 7fff7bcd lResult = 8f127bcd lResult = ff127bcd 嗯,運行很正確嘛……于是我們就放心的在自己的程序中使用起這個函數(shù)來了。 可是忽然有一天,我們的一個程序無論如何結(jié)果都不對!經(jīng)過n個小時的檢查和調(diào)試,最后終于追蹤到……CatenateBits16() !?它的返回值居然是錯的!! “郁悶!”你說,“這個函數(shù)怎么會有問題呢!?” 可是,更郁悶的還在后頭呢,因為你把程序中的輸入量作為參數(shù),在一個簡單的main()里面單步調(diào)試: / int main() { short sHighBits1 = 0x7FFF; short sHighBits2 = 0x8F12; unsigned short usHighBits3 = 0x8F12; short sLowBits1 = 0x7BCD; //你實際使用的參數(shù) short sLowBits2 = 0x8BCD; //你實際使用的參數(shù) long lResult = 0; printf("[sHighBits1 + sLowBits1] "; lResult = CatenateBits16(sHighBits1, sLowBits1); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(sHighBits2, sLowBits1); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(usHighBits3, sLowBits1); printf("lResult = %08x ", lResult, lResult); printf(" [sHighBits1 + sLowBits2] "; lResult = CatenateBits16(sHighBits1, sLowBits2); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(sHighBits2, sLowBits2); printf("lResult = %08x ", lResult, lResult); lResult = CatenateBits16(usHighBits3, sLowBits2); printf("lResult = %08x ", lResult, lResult); return 0; } / 發(fā)現(xiàn)結(jié)果竟然是: [sHighBits1 + sLowBits1] lResult = 7fff7bcd lResult = 8f127bcd lResult = 8f127bcd [sHighBits1 + sLowBits2] lResult = ffff8bcd //oops! lResult = ffff8bcd //oops! lResult = ffff8bcd //oops! 前一次還好好的,后一次就ffff了?X檔案? [X檔案的真相]: 注意那兩個我們用來當作低16位值的sLowBits1和sLowBits2。 已知: 使用 sLowBits1 = 0x7bcd 時,函數(shù)返回正確的值; 使用 sLowBits2 = 0x8bcd 時,函數(shù)中發(fā)生X檔案。 那么,sLowBits1與sLowBits2有什么區(qū)別? 注意了,sLowBits1和sLowBits2都是short型(而不是unsigned short),所以在這里,sLowBits1代表一個正數(shù)值,而sLowBits2卻代表了一個負數(shù)值(因為8即是二進制1000,sLowBits2最高位是1)。 再看CatenateBits16()函數(shù): / long CatenateBits16(short sHighBits, short sLowBits) { long lResult = 0; /* 32位值的臨時變量*/ /* 將第一個16位值放入32位值的高16位 */ lResult = sHighBits; lResult <<= 16; /* 清除32位值的低16位 */ lResult &= 0xFFFF0000; /* 將第二個16位值放入32位值的低16位 */ lResult |= (long)sLowBits; //注意這一句!!!! return lResult; } / 如果我們在函數(shù)中用 printf("sLowBits = %04x ", sLowBits); 打印傳入的sLowBits值,會發(fā)現(xiàn) sLowBits = 0x7bcd 時,打印結(jié)果為 sLowBits = 7bcd 而sLowBits = 0x8bcd時,打印結(jié)果為 sLowBits = ffff8bcd 是的,即使用%04x也打印出8位十六進制。 因此,我們看出來了: 當sLowBits = 0x8bcd時,函數(shù)中 "lResult |= (long)sLowBits;" 這一句執(zhí)行,會先將sLowBits轉(zhuǎn)換為 0xffff8bcd 再與lResult做或運算。由于現(xiàn)在lResult的值為 0xXXXX0000 (其中XXXX是任何值),所以顯然,無論sHighBits是什么值,最后結(jié)果都會是 0xffff8bcd 而當sLowBits = 0x7bcd時,函數(shù)中 "lResult |= (long)sLowBits;" 這一句執(zhí)行,會先將sLowBits轉(zhuǎn)換為 0x00007bcd 再與lResult做或運算。這樣做或運算出來的結(jié)果當然就是對的。 也就是說,CatenateBits16()在sLowBits的最高位為0的時候表現(xiàn)正常,而在最高位為1的時候出現(xiàn)偏差。 [教訓:在某些情況下作位運算和位處理的時候,考慮使用無符號數(shù)值——因為這個時候往往不需要處理符號。即使你需要的有符號的數(shù)值,那么也應該考慮自行在調(diào)用CatenateBits16()前后做轉(zhuǎn)換——畢竟在位處理中,有符號數(shù)值相當詭異!] 下面這個CatenateBits16()版本應該會好一些: / unsigned long CatenateBits16(unsigned short sHighBits, unsigned short sLowBits) { long lResult = 0; /* 將第一個16位值放入32位值的高16位 */ lResult = sHighBits; lResult <<= 16; /* 清除32位值的低16位 */ lResult &= 0xFFFF0000; /* 將第二個16位值放入32位值的低16位 */ lResult |= (long)sLowBits & 0x0000FFFF; return lResult; } / 注意其中的 "lResult |= (long)sLowBits & 0x0000FFFF;"。事實上,現(xiàn)在即使我們把CatenateBits16()函數(shù)的參數(shù)(特別是sLowBits)聲明為short,結(jié)果也會是對的。 本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/sandy1983/archive/2009/09/18/4565977.aspx 例子: view plaincopy to clipboardprint? def route(yate): def on_route(route): ... yate.onmsg("call.route", lambda m : m["called"] == "ivr").addCallback(on_route) def route(yate): def on_route(route): ... yate.onmsg("call.route", lambda m : m["called"] == "ivr").addCallback(on_route)在python中使用lambda來創(chuàng)建匿名函數(shù)。lambda來源于LISP語言。lambda的形式如下: lambda arg1,arg2... : lambda會創(chuàng)建一個函數(shù)對象,但不會把這個函數(shù)對象賦給一個標識符,而def則不同,它在創(chuàng)建函數(shù)對象的同時會進行這種操作。這是lambda的第一個特點。lambda的第二個特點是,它只是一個表達式,而不是一個語句。如果單獨使它成為了一個語句,比如: lambda x: print x 如果你在你的python程序中寫下了這么一行,那么毫無意義,這一行代碼會創(chuàng)建一個函數(shù)對象,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函數(shù)對象。也正是由于lambda只是一個表達式,它可以直接作為list或dictionary的成員,比如: L = [lamba x: x**2, lambda x: x**3] 在這個地方?jīng)]有辦法用def語句直接代替。第三,lambda表達式在“:”后只能有一個表達式。也就是說,在def中,可以放在return后的也可以放在lambda,不能放在return后也不能放在這里。更本質(zhì)地說,后面的表達式是能夠返回一個值的,不能返回值的不能放在這里。因此,像if或for或print這種語句就不能用于lambda中,lambda一般只用來定義簡單的函數(shù)。當然,通過一些技巧,可以在lambda中實現(xiàn)與if或for相同的功能。比如:if語句可以利用and和or這兩個邏輯操作符的“短路”特性來模擬,比如: ((test and [x]) or [y])[0] 這樣的話,如果test為真,那么就會計算[x],當然得到的就是[x],由于在or操作符的左邊已經(jīng)得到真值,or的右邊就不會被計算,因此得到的是[x][0],最后的結(jié)果是x。如果test為假,那么根據(jù)and的特性,左邊已經(jīng)為假,右邊不會被計算。這時or的左邊為假那么就得到[y][0],最后的結(jié)果是y。注意在這里不能寫成如下的形式: (test and x) or y 在x為真值時,這種形式與上面這種形式是等價的。但設想這種情況,“如果test為真,則取0,如果test為假,則取[]”,也就是說x本身是一個假值,用上面的形式書寫就是: (test and 0) or [] 顯然不能達到目的,這個式子永遠只會取到[]。因此應該改寫成: ((test and [0]) or [[]])[0] 在lambda中循環(huán)語句也是可以模擬的,用的是map函數(shù)。比如: F=lambda x: map((lambda y: y**2), x) 當然,這種東西看起來就很復雜,如果可能最好不要嵌套使用lambda。print也是可以模擬的: import sys pp = lambda x: sys.stdout.write(str(x)+'/n') pp(8) ===> 8 本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/kernelspirit/archive/2008/07/09/2631023.aspx

總結(jié)

以上是生活随笔為你收集整理的Python 的运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。