亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3510 | 回復(fù): 17
打印 上一主題 下一主題

pppk之Recipe1.2(1) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-08-17 20:13 |只看該作者 |倒序瀏覽
今天開始Recipe 1.2: 默認值的使用。準(zhǔn)備分2天來完成發(fā)帖。
代碼的checkout方法:

  1. svn checkout http://pppk.googlecode.com/svn/trunk/ pppk
復(fù)制代碼
Recipe1.2的引用話是:
  1. 今天不知為什么我沒寫--果戈里
復(fù)制代碼
據(jù)說,當(dāng)他沒寫作靈感的時候,他就反復(fù)寫這句話,直到又開始寫作。

論壇徽章:
0
2 [報告]
發(fā)表于 2012-08-17 20:25 |只看該作者
本帖最后由 zhuyubei 于 2012-08-17 20:56 編輯

當(dāng)然我今天得寫。對于給一個變量或數(shù)組賦默認值。核心思路是這樣的:
  1. use $sFirst if $sFirst is true, else $sSecond
復(fù)制代碼
很好理解。但這牽涉到,什么會是true, 什么會是false。 在Perl以及Python,這會有些微妙
  1. my @aFirst = ( undef, 0, "0", 0.0, "0.0" , 00000, "00000", "", " ", 23, "32", [] );
  2. my $sSecond = "backup";

  3. # Pay attention to the values which are false
  4. foreach my $sIndex ( 0 .. $#aFirst ){
  5.         my $sFirst = $aFirst[ $sIndex ];       
  6.         # use $sFirst if $sFirst is true, else $sSecond
  7.         my $sDefaultValue = $sFirst || $sSecond;
  8.         if( $sFirst ){
  9.                 print "[ $sIndex ] I'm first: [$sDefaultValue]\n";
  10.         }
  11.         else{
  12.                 print "[ $sIndex ] I'm Second: [$sDefaultValue], first is  [$sFirst]\n";
  13.         }
  14. }
復(fù)制代碼
在@aFirst里的值都會被if測試是True還是false。我們的常識是0, undef, ""一定是false。但這還不夠,由于Perl是弱類型,字符串里含數(shù)字,可以被嘗試進行數(shù)值化轉(zhuǎn)換。所以要注意: 字符串"0"也是false。那0.0是不是false呢?它也是false.但要注意"0.0"又不是false。這要注意啊。另外00000是false, 但是"000000"又是true!
有些吭爹是吧。我特意在里面放了一個空數(shù)組的引用,它不是false。
希望有高手能對這樣的現(xiàn)象給個好的解釋。

論壇徽章:
0
3 [報告]
發(fā)表于 2012-08-17 20:36 |只看該作者
Perl里標(biāo)量的賦默認值的語句如下。
  1. my $sDefaultValue = $sFirst || $sSecond;
復(fù)制代碼
利用||的短路特性,如果第一個表達式是true的話,它就直接返回其值,如果不是true,就返回第二個值。

但在這樣的情況下,由于0這樣的值也被當(dāng)作是false, 而它也許是數(shù)組里的一個你需要的下標(biāo)。所以你可以采取另一種更嚴格的方式來判斷其是不是false。也就是
  1. 用defined函數(shù)來判斷,只有當(dāng)變量是undef的時候它才是false
復(fù)制代碼
按照這樣的思路,我們可以用三元表達式來做這樣的工作。
  1. my $sNotDefined = undef;
  2. my $sDefaultValue = defined( $sNotDefined ) ? $sNotDefined : $sSecond ;
  3. print "When using undef: $sDefaultValue\n";
復(fù)制代碼
當(dāng)然在標(biāo)量環(huán)境下你也可以用 or 來代替 ||以獲得更好的可讀性。但是要注意操作符優(yōu)先級的問題。
  1. my $sDir = $ARGV[ 0 ] or "/tmp"; # or: another form of ||
復(fù)制代碼
最后一個例子是多個候選默認值的例子
  1. my $sUser = $ENV{ USER } or $ENV{ LOGNAME } or
  2.                  getlogin( ) or ( getpwuid( $< ) )[ 0 ] or
  3.                  "Unknown uid number $<";  
復(fù)制代碼

論壇徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大;照
日期:2013-04-17 11:46:39
4 [報告]
發(fā)表于 2012-08-17 20:44 |只看該作者
學(xué)習(xí)學(xué)習(xí)...

論壇徽章:
0
5 [報告]
發(fā)表于 2012-08-17 20:51 |只看該作者
本帖最后由 zhuyubei 于 2012-08-17 20:58 編輯

輪到Python了。Python里沒有 ||, 只有or
  1. value = a or b
復(fù)制代碼
我們還是看看什么樣的值是false,什么樣得值是true
  1. firstlist = [ None, 0, "0", 0.0, "0.0", 00000, "00000", "", " ", 23, 32, [ ] ]
  2. second = "backup"

  3. # Pay attention to the values which are false
  4. for index in range(len(firstlist)):
  5.         # use first if first is true, else second
  6.         value = firstlist[ index ] or second
  7.         if firstlist[ index ]:
  8.                 print "print [ %d ] I'm first: [%s]" %( index, value )               
  9.         else:
  10.                 print "print [ %d ] I'm second: [%s], first is [%s]" %( index, value, firstlist[ index ] )
復(fù)制代碼
Python是個強類型的語言。字符串是不能隱式轉(zhuǎn)成數(shù)字的。所以這里"0"是true. 0.0這里依舊是false. 不同的是,里面的一個空列表。雖然同樣放得是引用,但是空列表在這里被當(dāng)作是false! 這一點和Perl不一樣。Perl的引用測試的時候想必類似于字符串。

同樣,為了避免把0也當(dāng)作是false. Python里面同樣用None來作為Perl里的undef。你可以用is not None來判斷是不是空的. 而且Python里沒有三元表達式的。在Python里,它引入了這樣的方式來作為三元表達式, a if a is not None esle b
  1. notdefined = None
  2. # use first if first is not a none value, else second
  3. # property and / or operator
  4. value = notdefined if notdefined is not None else second # From python 2.5
復(fù)制代碼
其語句的意思幾乎就和注釋: use first if first is not a none value, else second一致。

另外對于Python2.5之前的版本?梢赃@樣寫
  1. value = notdefined is not None and notdefined or second  # Before python 2.5, not so readable
復(fù)制代碼
我覺得可讀性不很好。對于可讀性不好的東西,我都有些抵觸。這里它用了and 和 or的賦值特性。 對于and如果第一個是true,它就返回and后面的那個值,否則就返回第一個false。而對于or, 如果第一個是false,它就返回or里的第二個表達式的值,否則就返回第一個值。

而對于連續(xù)多個候選默認值的問題。Python也差不多。
  1. user = os.environ["USER"] or os.environ["LOGNAME"] or\
  2.        os.getlogin( ) or pwd.getpwuid( os.getuid() )[ 0 ] or\
  3.        "Unknown uid number %" % os.getuid();
  4. print "User:",user
復(fù)制代碼
好了,今天就寫到這里

論壇徽章:
0
6 [報告]
發(fā)表于 2012-08-17 20:55 |只看該作者
對于Perl來說,可能給變量默認值會更有用些。尤其是給一些函數(shù)傳參數(shù)。如果參數(shù)不是很多,你又不想用hash來賦默認值的話,就可以用今天說的Recipe來給參數(shù)賦默認值。而Python的函數(shù)參數(shù)由于可以指定默認值,所以也許未必這么有用。

總之一句話,要是函數(shù)的參數(shù)需要給默認值,希望大家能記起這個Recipe。

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
7 [報告]
發(fā)表于 2012-08-17 21:21 來自手機 |只看該作者
Truth and Falsehood
The number 0, the strings '0' and "" , the empty list () , and undef are all false in a boolean context. All other values are true. Negation of a true value by ! or not returns a special false value. When evaluated as a string it is treated as "" , but as a number, it is treated as 0. Most Perl operators that return true or false behave this way.

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
8 [報告]
發(fā)表于 2012-08-17 21:25 來自手機 |只看該作者
希望再講下perl的 //   defined-or

論壇徽章:
0
9 [報告]
發(fā)表于 2012-08-17 21:36 |只看該作者
謝謝版主大人的回復(fù)。我對not和!的特性又有了更好的理解。

的確Cookbook里是有//的,看來你很熟悉的,哈哈. 因為我的Perl版本是Perl5.8.8的,雖然可以use 5.9,不過我一直比較反感IT行業(yè)的升級更新之類的情況。當(dāng)時就沒加入這塊內(nèi)容。

不過既然您提到了,我還是馬上更新下code, 把這塊加進去吧!謝謝!

論壇徽章:
0
10 [報告]
發(fā)表于 2012-08-17 21:50 |只看該作者
我只知道現(xiàn)在用的比較多的方式應(yīng)該是
  1. $var=$a // $b
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP