Python與Perl的相似與差別


Python version 3.7版本

00.命令行交互

命令行交互
Perl Python
perl -e <Perl代碼>     #Unix/Linux/Windows/DOS 直接命令行輸入Python回車,就可以編碼運行代碼

 

 

 

 

0.變量

區別:Python變量前沒有區分是普通變量還是列表(數組)的符號,Perl有區分,$bianliang   @shuzu  %hash

相同:命名要求一致,字母數字下划線

 

1.print輸出

二者通用格式:print(“字符串”);

Perl:

print(“字符串1”."字符串2".$bianliang(任何變量都可以)."\n");     #無自帶換行符

Python:

print(“字符串1”+“字符串2”+字符變量1+str(非字符變量2));  #a="map" 字符變量  a=1非字符變量     #自帶換行符

對於列表和字典,print(塊1,塊2,塊3) #可以用逗號隔開一起輸出,輸出結果為各模塊之間是空格

 

2.注釋

二者相同都用#

 

3.Perl的數組 <=> Python的列表

 
  Perl數組(@arr) Python列表
定義

@shuzu=(1,5,'trek','amil'); 

@shuzu0=(3..18);  #3到18,步長為1   #創建數值數組

list1=[1,5,'trek','amil']

numbers=list(range(1,6)) #創建數值列表,默認步長為1,數值為[1,6)左閉右開表,即1,2,3,4,5

even_numbers=list(range(2,11,2)) #創建數值列表,步長為2,數值為,2,4,6,8,10

函數range()幾乎能夠創建任何需要的數字集,eg:5**2=25  平方計算等

字符串互轉數組(列表)

#轉字符串為數組

$var_names = "google,taobao,runoob,weibo";  @names = split(','$var_names);

#轉數組為字符串

$string2 = join( ','@names );     

str= list('trek')  #['t','r','e','k']  #轉字符串為列表

list1=['ak','uk',4]

list2=[str(i) for i in list1] #使用列表推導式把列表中的單個元素全部轉化為str類型

list2 #查看轉化后的列表 ['ak', 'uk', '4']

list3=' '.join(list2) #把列表中的元素放在空串中,元素間用空格隔開

list3 #查看生成的長串  'ak uk 4'

索引

從0開始,索引-1指定為列表最后一個元素,eg:  $shuzu[-1]

$max_index=$#shuzu;  #數組最后一個元素的索引值

從0開始,索引-1指定為列表最后一個元素,eg:list1[-1]

 

排序

@shuzu = sort(@shuzu);   #數組排序是根據 ASCII 數字值來排序。所以我們在對數組進
行排序時最好先將每個元素轉換為小寫后再排序  #不改變原數組排序

@shuzu1= sort {lc($a) cmp lc($b)} @shuzu #將每個元素轉換為小寫后再按字母順排序,

調整$a與$b位置為倒序排序

@shuzu1= sort {$a <=>$b} @shuzu  #對數字從小到大排序,調整$a與$b位置為從大到

小排序

@shuzu = reverse(@shuzu); #逆序,不改變原列表

sorted(list1) #按字母順序臨時性排序,不改變原列表排序 

#必須用這種格式,list1.sorted()行不通

sorted(list1,reverse=True) #按字母倒序臨時性排序,不改變原列表排序  

#必須用這種格式,list1.sorted()行不通

 

list1.reverse() #逆序,永久性排序

list1.sort() #按字母順序永久性排序,無法恢復到原來的排序

#必須用這種格式,sort(list1)行不通

list1.sort(reverse=True) #按字母倒序永久性排序,無法恢復到原來的排序  

計算

$size_arr=@shuzu;  #計算數組元素個數

len(list1) #計算列表元素個數

min(numbers)  #求最小值

max(numbers)  #求最大值

sum(numbers)  #求和

輸出 print($shuzu[0]);

print(list1[0]); 

print(list1[0],list[1])  #結果為:1 5

末尾添加元素 push(@shuzu,"字符串"or變量or數組or1..100)  list1.append('tool')
合並

@numbers = (1,3,(4,5,6))

@arr0=(@shuzu,@shuzu0); 

 
末尾刪除元素 $num=pop(@shuzu) #彈出數組最后一個元素,並返回它 name=list1.pop()  #刪除列表末尾元素,並讓你能接着使用此元素 
刪除索引位置元素

pop不能;

splice (@array, 2, 1)  #索引2處,替換一個為空,即刪除索引2處元素,后邊元素自動向前補充

delete $array[2]  #刪除數組第3個元素,當index大於數組長度時,函數delete對數組沒影響;
delete刪除元素后, index后面的元素並不會主動往前移動,該元素刪除后,在array還留有一個undef的元素,顯然刪除得不夠干凈。

name=list1.pop(2)#刪除列表任意索引位置的元素,並讓你能接着使用此元素;

list1[2:3]=''  #將索引2處元素替換為空,后邊遠元素前移

del list1[2]  #刪除列表第3個元素

刪除指定元素

 

name=list1.remove(‘tool’) #刪除列表中的某個指定元素(如果有重復元素,

只刪除索引位置靠前的那個),並返回它可以使用

開頭刪除元素 $num=shift(@shuzu) #彈出數組第一個值,並返回它。數組的索引值也依次減一 沒有對應的類似函數
開頭添加元素

unshift(@shuzu,"字符串"or變量or數組or1..100)

#將元素放在數組前面,並返回新數組的元素個數

沒有對應的類似函數
索引位置添加元素 splice (@array, 1, 0, "Hello") #在1索引位置插入Hello,其他元素一次后移

list1.insert(0,'tool')#列表索引0處插入元素,原0,1等都往后移動一位

str1 = ["a","b","c"] ;str1[2:2] = "f"  #插入新的索引2,原索引2依次往后推

print("插入新的索引2結果 :",str1)  #結果:插入新的索引2結果 : ['a', 'b', 'f', 'd', 'e']

修改元素 $shuzu[1]="8" ;#單個位置替換(修改)元素 list1[1]="8" ; #單個位置替換(修改)元素
修改元素(切片|拼接)

splice(@shuzu05521..25); #從數組索引值為5(即第6個元素)開始(包含替換

的起始位置)替換5個元素,為21..25; #1個或多個替換(修改)元素

 

@retval = splice (@array, skipelements, length, @newlist);

拼接函數可以向列表(數組)中間插入元素、刪除子列表或替換子列表。

參數skipelements是拼接前跳過的元素數目,length是被替換的元素數,newlist是將要拼接進來的列表。

當newlist的長度大於length時,后面的元素自動后移,反之則向前縮進。

當length=0時,就相當於向列表中插入元素,而形如語句 splice (@array, -1, 0, "Hello");

即向數組末尾添加元素。

當newlist為空時,就相當於刪除子列表,這時,如果length為空,就從第skipelements個元素后全部

刪除。所以刪除最后一個元素則為:splice (@array, -1);這種情況下,返回值為被刪去的元素列表。

splice(@array,0,0) #刪除數組所有元素

#替換索引2到最后一個索引為'd', 'e'

str1 = ["a","b","c"];str1[2:] = list("de")

print("替換索引>=2結果 :",str1)  #結果:替換索引>=2結果 : ['a', 'b', 'd', 'e']

#替換索引2-3(索引2-3替換為"g","h","i",原索引4到最后依次往后推)

str1=['a', 'b', 'f', 'd', 'e'];str1[2:4] = ["g","h","i"]

print(str1)     #結果:['a', 'b', "g","h","i", 'e']

#刪除列表所有元素
str1[:] = []

切片

切片,處理列表部分元素,如下

@shuzu2=@shuzu[2,4,6,7,-3,-1]  #數組索引需要指定有效的索引值,可以是正數后負數,

每個索引值使用逗號隔開。

@shuzu3=@shuzu[2..-1] #如果是連續的索引,可以使用 .. 來表示指定范圍。#左閉右閉

切片,處理列表部分元素,如下

list2=list1[:]  #等價於list1  #可用於復制列表,因為list2=list1  不是復制,只是同
個列表有兩個標簽,修改其中任何一個標簽,都會更改二者的列表信息;

list2=list1[0:-3]  #左閉右開,切取列表第1位,到倒數第4位

list2=list1[1:] #從列表第2位到最后

list2=list1[:-1] #從列表第1位開始到倒數第2位

元組

 

不可變的列表=》“元組”“tuple”,元組比列表更簡單的數據結構,如下

tuple1=(250,50)  #tuple1[0]=400 不允許,會報錯 

tuple1=(400,50)  #給元組變量賦值是合法的,不會報錯,之前元素被覆蓋

唯一元素數組(列表)

 

每個元素都唯一的列表=》集合  set(list1),不改變原列表

 

 

 

 

 

 

 

 

 

 

 

 

 

4.for循環

Perl:

for( $a = 0$a < 10$a = $a + 1 ){

  print "a 的值為: $a\n";

}

 

遍歷一維哈希:
foreach my $key(sort {$hash{$b}<=>$hash{$a}}  keys %hash){      #對value值按照數字大小進行逆序排序
  print $key."t".$hash{$key}."n";
}
遍歷二維哈希:使用$hash{$key1}{$key2}=$value;
foreach my $key1(sort keys %hash){    #首先對key1進行排序
  foreach my $key2(sort {$hash{$key1}->{$b}<=>$hash{$key1}->{$a}}  keys  %{$hash{$key1}}){      #對value值按照數字大小進行逆序排序
   #foreach my $key2(sort {$a<=>$b}  keys %{$hash{$key1}}){                                                              #對key2按照數字大小進行排序,正順序排序
    print $key1."t".$key2."t".$hash{$key1}->{$key2}."n";
  }
}
 
 

Python:

for list_v in list1:    #遍歷列表

  print(list_v);

  #break       #退出while循環,不再運行循環中余下代碼

  #continue  #終斷單次循環,進入下一個循環

print("thank you,everyone\n");

列表解析

squares=[value**2 for value in range(1,11)]    #[1,4,9,16,25,36,49,64,81,100]

 

for key1,value1 in alien.items():      #遍歷字典所有鍵值對

  print("\nKey: "+ key1)

  print(Value: " + value1) 

for key1 in alien.keys():                   #遍歷字典中的所有鍵

#for key1 in alien:                           #遍歷字典中的所有鍵,遍歷字典時,默認遍歷所有的鍵

  print(key1.title())

for key1 in sorted(alien.keys()):      #按順序遍歷字典中的所有鍵  

  print(key1.title())            

for  value1 in alien.values():           #遍歷字典中所有值,沒有刪除重復,都列出

  print(value1.title())

for  value1 in set(alien.values()):           #遍歷字典中所有值,刪除重復,值唯一,set(集合)類似於列表

  print(value1.title())

注意:for能遍歷列表,但不能修改列表,否則Python難以跟蹤其中元素;

 

 

5.if條件判斷   

注意:Perl和Python都是只要一個在if整體模塊中,只要有一個if 或者elsif|elif判斷是真,下邊的條件判斷就會跳過去,不在運行;

Perl:

if(條件判斷){

}

 

if(條件判斷){

}else{    #可省略

}

 

if(條件判斷){

}elsif(條件判斷){

}else{    #可省略

}

條件判斷常用:

True         #布爾值

not True   #布爾值

! True       #布爾值

False       #布爾值

數字 0、字符串 '0' 、 "" 、空數組list ()  和 undef 為 false

> ; >= ; < ; <= ; ==;!=;<=>比較,返回0或者 1或者 -1;    #數值比較大小     ==    #判斷是否相等;  !=  #判斷是否不相等; 

bt ; be ; lt ;  le ; eq ; ne ; cmp比較,返回0或者 1或者 -1;    #字符串比較大小

=~  #匹配

&& #且

||  #或者

 

 

Python:

if 條件判斷:

  執行語句1

  執行語句2

 

if 條件判斷:

  執行語句

else:             #可省略

  執行語句

 

if 條件判斷:

  執行語句

elif 條件判斷:

  執行語句

else:             #可省略

  執行語句   

 

條件判斷常用:

bianliang1=True  #直接布爾值

bianliang2=False #直接布爾值

列表為空,即list1=[],則 if list1 :  判斷為False

==    #判斷是否相等;  #區分字母大小  #適用於字符串、數值

!=     #判斷是否不等;  #區分字母大小  #適用於字符串、數值

 car=“Audi”; car.lower()=="audi"  #都轉化為小寫,再比較;

< ; <=; >; >=; ==;!= ; #比較數值大小

4 % 3 == 1  #求模運算符%,兩個數相除返回余數

and  #且

or     #或

list1=['1','buht','4'];   "buht" in list1  #True  #判斷某元素是否在列表中

list1=['1','buht','4'];   "8" not in list1  #True  #判斷某元素是否在列表中

 

6.Perl的哈希hash<=> Python字典

Perl:

%data= ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

print "\$data{'google'} = $data{'google'}\n";

print "\$data{'runoob'} = $data{'runoob'}\n";
print "\$data{'taobao'} = $data{'taobao'}\n";
一個鍵對應一個值,值可以是Perl中任何對象(eg:數字、字符串、數組、哈希hash);所有的鍵之間必須唯一,所有的值可不唯一;
$data{'google1'} = 'google1.com';   #添加鍵值對 
%data=()  #創建空哈希
$data{'google'} = 'google1.com';   #修改哈希中的值 
delete $data{'taobao'};    # 刪除哈希中的元素(鍵值對)

Python:

alien_0={'color':'green','points':5}   #定義字典,方式1

alien_0={                   #定義字典,方式2,多了個最后的逗號,大括號位置必須這樣放,注意縮進格式固定

  'color':'green',

  'points':5

  } 

print("alien_0['color'] = "+alien_0['color']);

print("alien_0['points'] = "+alien_0['points']);

print(alien_0['color'],alien_0['points'])  #結果為:green 5    

一個鍵對應一個值,值可以是Python中任何對象(eg:數字、字符串、列表、字典);所有的鍵之間必須唯一,所有的值可不唯一;

alien_0['x_position']=0    #添加鍵值對   #鍵值對的添加順序跟添加順序不同,因為字典關注的是鍵值關聯關系

alien_0={}                       #創建空字典

alien_0['color']='yellow'   #修改字典中的值,由green變yellow

del alien_0['color']          #刪除鍵值對

#嵌套

#嵌套-字典列表(列表中嵌套字典)------------------------------>經常需要在列表中包含大量的字典,而其中每個字典都包含特定對象的眾多信息

alien_0={'color':'green','points':5}

alien_1={'color':'yellow','points':7}

alien_2={'color':'red','points':8}

aliens=[alien_0,alien_1,alien_3]

for alien in aliens:

  print(alien)

 

#嵌套-列表字典(字典中嵌套列表)------------------------------->每當需要在字典中將一個鍵關聯到多個值時,都可以在字典中嵌套一個列表【即,字典是鍵值一對一,值用列表,就相當於鍵值一對多】

pizza={                                                            #一個物體,對應多個方面的信息

  ‘crust’:‘thick’,             #披薩皮厚薄

  ‘toppings’:['mushrooms','extra cheese'],   #披薩配料

  }

#嵌套-字典字典(字典中嵌套字典) -------------------------------->內部嵌套的眾多字典,一般結構都相同,因為,這樣使得后續的處理(eg:for循環)簡單,否則會很復雜

users ={

  'A':{

    'first':'albert',

    'last':'einstein',

    'loacation':'paris',

    },

  'B':{

    'first':'marie',

    'last':'curie'

    'location':'princeton',

    },

  }

 

7.指引用戶輸入、獲取用戶輸入

Perl:

獲取用戶命令行輸入:

$input=<STDIN>     
@ARGV#命令行輸入的東西,按空格分開,一次存入數組

輸出:

print STDOUT << "EOF"; #EOF 是一個標記的名字,自定義標記名稱 

Python:

message = input("Tell me something,and I will repeat it back to you: ")  #將獲取內容存儲為字符串;#冒號后面,包含一個空格,可將提示與用戶輸入分開,讓用戶清楚的知道其輸入始於何處

print(message)

message = int(message) #如果message獲取的內容是數值,則可以用int()轉為數值

 

8.while循環

Perl:

 

Python:

while 條件判斷:

  執行語句

  #break       #退出while循環,不再運行循環中余下代碼

  #continue  #終斷單次循環,進入下一個循環

while能遍歷列表同時修改列表;for能遍歷列表,但不能修改列表,否則Python難以跟蹤其中元素;

while能將列表和字典結合起來使用,可收集、存儲並組織大量輸入,供以后查閱和顯示;

 

9.python函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM