2011-10-26 67 views
2

我想要定義一個函數,它將包含一個變量n,其中n將是一串數字,例如, "3884892993",該函數的定義開始爲is_true(n),但是如果n將成爲一個字符串,它應該是is_true(n),然後一旦定義了字符串,我可以用一個例如n = "3884892993"這樣的字符串來測試該函數。但是,當我使用is_true(n)時出現語法錯誤。我只是想知道如何去測試這個函數的例子中的字符串爲n。使用變量定義函數?

我整個函數定義如下所示:http://oi44.tinypic.com/282i3qo.jpg但是記住我是一個絕對的新手,所以最有可能有不少錯誤,但我希望從一些專家一些幫助,如果可能的話:)

def is_valid("n"): #n is the number to be checked. 
    number = 
    [int(y) for y in A] #converts the string into a list of useable digits. 
    altern1 = integer[-2::-2] #sets altern1 as one set of alternating digits. 
    double = [x*2 for x in altern1] #doubles each element of the list altern1. 
    sum1 = sum(double) # adds together all the doubled items of the list. 
    altern2 = integer[-1::-2] #sets altern2 as the other set of alternating digits. 
    return sum2 = sum(altern2)#sums the other set of alternating digits. 
    sumtotal = sum1 + sum2 #works out the total sum to be worked with. 
    for mod = sumtotal % 10: #works out remainder when sumtotal is divided by 10 
     if mod == 0 : #if remainder is zero sumtotal is a multiple of 10 
      print 'True' #sumtotal is a multiple of 10 therefore n is a credit card number 
     else: 
      print 'False' #sumtotal is NOT a multiple of 10 therefore not a valid credit card number 

下面是實際的問題:

用於驗證數的算法如下: (a)用倒數第二位開始,並且朝着第一個數字工作,雙每個交替數字。 (b)將加倍的數字相加,將13視爲1 + 3等,並將結果加到非加倍數 數字之和 (c)如果總和可以被10整除,則該數字是有效的信用卡號碼。

編寫和測試功能is_valid(),接受作爲參數信用卡號碼作爲字符串 (如有效(「49927398716」)),並返回true或false,具體的數量是否是 有效的信用卡卡號。

+2

代碼爲JPEG?哇! – Johnsyweb

+0

嗯,我只是覺得使用剪切工具比粘貼到這裏更容易,並確保它傳遞正確的縮進(這可能是錯誤的)。這就是我是一個新手多少。也是它的意思是PNG,對此很抱歉。 –

+2

您可以打印出您的代碼的JPEG,將它放在[木桌](http://thedailywtf.com/Articles/Web_0_0x2e_1.aspx)上,並拍下它的照片? –

回答

1

我不知道你有什麼問題,但如果你想:

  • 正確定義功能:
    • 講究壓痕(!這是由Python的需要),
    • 看到here爲函數定義的例子,
  • 轉換一個字符串變量爲整數,你可以這樣做:

    new_var = int(old_var) 
    

    一般來說,請注意類型,因爲它不像其他一些動態類型語言和字符串不是動態轉換成數字 - 你應該明確地做到這一點。

  • 讀取變量的值,是根據它的名字:

    my_var = vars().get('variable_name') 
    

    (其中variable_name是變量的名稱,您也可以選擇vars後括號內給出情境 - 見help(vars)瞭解詳細信息)

有沒有解決你的問題?

EDIT(基於澄清):

這應該解決您的問題:如果要在傳遞的變量做「就地」東西

def is_true(my_variable): 
    # Here the variable named "my_variable" is accessible 

,我有一個壞消息:字符串和整數在Python中是不可變的,因此你不能簡單地改變它們 - 你應該返回它們作爲函數的結果(至少有兩種解決方法,但是如果你的話我不推薦它們在Python中是新手)。

EDIT(爲正確的代碼樣式):

你或許應該閱讀PEP 8來熟悉什麼是Python腳本編碼標準 - 這通常是不同的Python社區使用,您應該遵循(在有些觀點你應該欣賞它)。

+0

嗨,基本上我只是想讓函數讀取任何字符串替換「n」,然後對其執行操作。 –

+0

@GeorgeBurrows:好的,我剛剛更新了我的答案,所以它可能會更好地回答你的問題。 – Tadeck

+0

嗨,所以基本上我不能用字符串測試代碼?如果因爲發現問題而中度刺激,那麼現在對我來說這些問題是相當不可能的,謝謝你的幫助。 –

0

我不知道你的功能應該做什麼,但這裏有一些評論。

首先,如果你定義的函數,那麼你使用以下語法

def is_true(n): 
    # do something 

,你可以調用這個函數像這樣is_true("3884892993"),即你可以傳遞字符串作爲n。您的函數現在需要將變量n作爲字符串處理。因此,您可以使用

number = [int(d) for d in n] 

這將導致將字符串轉換爲數字列表。

還有一點評論:您在is_true函數中使用了return聲明。該語句將停止執行該函數並返回該值。低於return的每個代碼都不會執行。

+0

該函數用於接受11個數字的輸入字符串,然後用這些數字取以倒數第二位數字開始的交替數字並向後工作,將這些數字加倍,然後總和數字,例如如果你有18和3,你會做1 + 8 + 3.然後把這個總和加到剩下的沒有加倍的數字之和上,然後算出它是否是10的倍數,如果它是真實的,if不是然後打印錯誤。我不確定這對專家來說有多複雜,但對我來說,3周前纔開始學習python是不可能的。 –

+0

對不起,在第二行它應該是'交替數字' –

+0

也我不知道爲什麼我在那裏包括'返回',謝謝你的位置。 –

4

引號僅用於字符串文字,不會將引號中的變量或參數名稱括起來以表示它是字符串。該函數的定義如下所示:

def is_true(n): 

然後在函數體中使用n引用由調用者傳遞的價值。

要調用一個特定值的函數,你這樣做:

is_true("3884892993") 

方建議:想想你的函數和變量的更多解釋的名稱。例如,你的功能似乎可以合理地稱爲is_valid_card_number

+0

嗨,如果調用特定值的函數,它會認識到使用n作爲specfic值,然後執行該函數的其餘部分? –

+0

是的,n將保存您在is_true(「3884892993」)調用中傳遞的值。 – Wieland

1

Wikipedia article on the Luhn algorithm

def is_luhn_valid(cc): 
    num = map(int, str(cc)) 
    return sum(num[::-2] + [sum(divmod(d * 2, 10)) for d in num[-2::-2]]) % 10 == 0 
+0

可悲的是,我不允許blatantley剽竊,必須寫一些原創的,這是很多要求只有3周經驗的人:( –

0

可能是這樣的。我留下您的評論

def is_valid(n): #n is the number to be checked. 
    numbers = [int(y) for y in n] #converts the string into a list of useable digits. 
    double_alt = [sum([int(i) for i in str(x*2)]) for x in numbers[-2::-2]] #doubles  and sum if more than 10each element of the list altern1. 
    sum1 = sum(double_alt) # adds together all the doubled items of the list. 
    sum2 = sum(numbers[-1::-2]) #sums the other set of alternating digits. 
    sumtotal = sum1 + sum2 #works out the total sum to be worked with. 
    return not sumtotal % 10 
0

這裏是我最近不得不做的luhn算法的實現。

def is_valid_luhn(cc): 
    return not sum([sum(divmod(int(d) * 2, 10)) for d in cc[-2::-2]] + [int(d) for d in cc[-1::-2]]) % 10 
    #       | double |  |--- every -2th --|   |--- every -1th --| 
    #       |--------- step 1 -----------------| 
    #    |------------- sum doubled digits --------------| |-- sum undoubled digits --| 
    #   |---------------------- step 2: sum doubled/undoubled digits -----------------------| 
    #  |-------------------------- step 3: sum % 10 == 0 --> not sum % 10 --------------------------| 

或者,如果你想更詳細的版本:

def is_valid_luhn(cc): 
    total = 0 
    # Double and sum every 2nd digit starting at -2. 
    for d in cc[-2::-2]: 
     # divmod(d*2, 10) returns (d*2 // 10, d*2 % 10) 
     # sum(divmod) return (d*2 // 10) + (d*2 % 10) 
     total += sum(divmod(int(d) * 2, 10)) 
    # Sum every 2nd digit starting at -1. 
    for d in cc[-1::-2]: 
     total += int(d) 
    # Check module 10 of total: total % 10 == 0 --> not total % 10 
    return not total % 10