/ / / / / /

上一篇 下一篇 同標題 發表文章 文章列表

作者  weihan (天天天藍) 站內  CPP_DS
標題  python 的一些補充內容
時間  2014/06/05 Thu 07:51:12

以下是昨天上課內容的一些補充說明:

(1) 星號的使用:
   星號的使用方式分為兩種,一種是在等號的左側,一種在等號右側,兩種
   使用意義有些不同。在左側的星號有合併(或打包)為串列的意思,
   但在等號右側的星號則是拆解的意思。 不管哪種,星號之後的變數都是串列,
   例如:

      ( a , *b ) = ( 1 , 2 , 3 , 4 )
   則
      a = 1
      b = [ 2 , 3 , 4 ]


      ( x , y , *z ) = [ 1 , 2 , 3 , 4 ]
   則
      x = 1
      y = 2
      z = [ 3 , 4 ]


      ( *p , q , r ) = ( 1 , 2 , 3 , 4 )
   則
      p = [ 1 , 2 ]
      q = 3
      r = 4

   一個指定式子僅能有一個星號,例如:以下的設定方式是不對的。

      ( a , *b , *c ) = ( 1 , 2 , 3 , 4 , 5 )

   至於等號右側的星號是將串列拆解成一個個元素,也就是若將串列
   當成盒子,串列內的元素就是盒子內的東西。等號右側的串列前加上星號
   相當於將盒子去除,將元素直接取出來。例如:以下的 range 函式
   用了兩個獨立整數設定將產生數字的範圍,既 [1,2,3,4]

      range(1,5)

   若你將 1 與 5 兩個數字存在某個串列 p = [1,5] 則你可使用以下
   方式來達到你的目的:

      range(p[0],p[1])

   這樣的寫法有點麻煩,若此時你在 p 的前面加上星號,將串列拆解
   成一個個元素,這樣就方便同時簡潔多了

      range( *p )     等同   range(p[0],p[1])

   但不能寫成 range( p ) ,因為這樣寫會被視為一個串列參數。

   需注意的是,等號右側的星號用法僅能用在函式參數設定上,不能用
   在一般的指定式子,例如:

       ( a , b ) = *p

   這種寫法是錯的。



(2) lambda 簡易函式設定:

    lambda 函式可用來設定簡易的一個式子的函式,超過一個式子就不行。例如:

       a = list( map( lambda x : "{0:#^3}".format(x) , (2,3,4) ) )

    x 為 lambda 函式的自變數,以上 (2,3,4) 串列的每個元素依次
    被當成 x 使用,以上式子分別執行:

       "{0:#^3}".format(2)   --->   '#2#'
       "{0:#^3}".format(3)   --->   '#3#'
       "{0:#^3}".format(4)   --->   '#4#'

      這裡的 #^3 是資料用 3 格來印,^ 為置中對齊符號,多餘的格子使用 # 號,
    三個 format 式子分別產生字串,因此 a 就是:

       a = ['#2#', '#3#', '#4#']

    式子如果不這樣寫,你就要寫成以下方式:

       a = []
       for x in (2,3,4) :
          a.append( "{0:#^3}".format(x) )


    此外 lambda 的自變數,也可以是串列,例如:

       a = [ (1,7) , (2,3) , (3,1) , (4,2) ]
       b = sorted( a , key=lambda x : x[0]+x[1] )

    以上 a 串列的每個元素都是包含一對數字的串列,因此 lambda 函式
    的 x 就分別是 (1,7) , (2,3) , (3,1) , (4,2)
    x[0] 代表其內的第一個數字 , x[1] 代表其內第二個數字。這個排序
    方法是比較每對串列數字和的大小,由小排到大,因此 b :

       b =  [(3, 1), (2, 3), (4, 2), (1, 7)]


ps:有時後同樣輸出的程式寫法不見得僅有一種,例如:

       a = list( map( lambda x : "{0:0>2}".format(x) , range(10) ) )

    等同:
       a = list( map( "{0:0>2}".format , range(10) ) )

    等同:
       a = [ "{0:0>2}".format(x) for x in range(10) ]

    都會產生:
       ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09']


python 程式是很活潑的,也很有趣,對數學系的人應該是非常對味的,
我很高興這學期教授 python 程式

















--
===================================================================
*               人生的意義 : 盡責任  負責任                      *
*               人生的目的 : 受報  還願  行善                *
*               人生的價值 : 奉獻  付出                        *
================================================== 聖嚴法師  語 ===

--
發信站 [中央數學  織夢天堂 bbs.math.ncu.edu.tw]
  •FROM [weihan 從 ziyou4.math.ncu.edu.tw 發表]

上一篇 下一篇 同標題 發表文章 文章列表