2012-04-17 58 views
0

該函數假定在兩種情況下輸入都是可以接受的(即)當str執行爲int時,假定str包含實際的int,反之亦然始終可以正常工作如何在不使用任何內置python函數的情況下將str更改爲int並反之亦然?

該函數也不能使用易於使用內置在python函數中,如int()或str()。只能使用基本編碼和def頭文件,例如(for in in in)()和條件句,以及不能。)請參閱幫助。 :)

+0

這是很好的,你這個標記作爲家庭作業,但你仍需要證明你已經嘗試什麼或問你能不能找出一個具體的問題。 – agf 2012-04-17 23:53:58

+0

'range()'是一個內建函數,所以你不能使用它?還是有一堆例外? – 2012-04-17 23:55:41

+0

@gnibbler:在我看來,'range()'(或至少是'xrange()')是因爲它_does_屬於基本編碼。沒有它,你可能不會有能力做其他語言的基本'for'循環(例如'for(var i = 0; i <10; i ++)')。或者你需要在[0,1,2,3,4]中列出'i'的所有值,而不是'for xrange(5)'中的i'。 – Tadeck 2012-04-18 00:34:47

回答

0

這只是爲int更換,並沒有處理所有的事情,但它是作業,所以我會讓你休息。如果您使用ord,它可能會變得更簡單。

def myint(s): 
    x = 0 
    for ch in s: 
     if ch == '0': x = x * 10 + 0 
     if ch == '1': x = x * 10 + 1 
     if ch == '2': x = x * 10 + 2 
     if ch == '3': x = x * 10 + 3 
     if ch == '4': x = x * 10 + 4 
     if ch == '5': x = x * 10 + 5 
     if ch == '6': x = x * 10 + 6 
     if ch == '7': x = x * 10 + 7 
     if ch == '8': x = x * 10 + 8 
     if ch == '9': x = x * 10 + 9 
    return x 
+0

即使上面的醜陋功能比這更醜陋。 – ch3ka 2012-04-18 00:16:17

+0

@ ch3ka,_overove_不是一個非常有用的概念時,答案的順序不斷變化:) – 2012-04-18 00:23:17

+0

if的鏈條的缺點是,你正在做每個數字10比較 – 2012-04-18 00:24:50

2
def str2int(s): 
    i = 0 
    chr2digit = {`j`:j for j in (0,1,2,3,4,5,6,7,8,9)} 
    for c in s: 
     i = i*10 + chr2digit[c] 
    return i 


def int2str(i): # rather easy in Python2 
    return `i` 

def int2str(i): # works in Python2 and Python3 
    return "%s"%i 
+0

這讓我的小貓哭了。 – ch3ka 2012-04-18 00:10:34

+0

@ ch3ka這比十幾個'如果'更糟? – agf 2012-04-18 00:11:11

+0

@ ch3ka,使用這樣的字典(作爲映射)在處理任意映射時是非常正常的。不允許使用'ord()',所以這裏很適合。通常我不會內聯字典,但這只是播放代碼,所以問題是什麼? – 2012-04-18 00:21:45

0

這裏有一個方法,你可以考慮:

x = "1" 
print type(x) 
<type 'str'> 
import string 
if x in string.digits: 
    # Now you know that x is a number 
    print x 

你可以做同樣的string.ascii_letters了。不是一個完整的答案,但應該指出你在正確的方向。

+0

除非'x'是'10',它不是'string.digits'中的。 – robert 2012-04-18 00:06:01

+0

然而x [0]和x [1]都是。 – 01100110 2012-04-18 00:11:17

1

它可能很醜,但它的工作原理。看到這個函數:

>>> def strint(val): 
    digits = '' 
    try: 
     # Trying to treat it as a string-to-int conversion 
     result = 0 
     for l in val: 
      result = result * 10 + digits.index(l) 
    except (TypeError,): 
     # There was a type error - we have int instead of string 
     result = '' 
     while val: 
      digit = val % 10 
      result = digits[digit] + result 
      val = val // 10 
     else: 
      if not val and not result: 
       result = '0' 
    return result 

>>> strint('123') 
123 
>>> strint(123) 
'123' 
>>> strint('0') 
0 
>>> strint(0) 
'0' 
+0

哇。這*是醜陋的。但是..工作,顯然。 – ch3ka 2012-04-18 00:14:56

+0

我不認爲你可以使用'digits.index' – 2012-04-18 00:15:41

+1

@gnibbler:如果'digits.index'確實不被允許,我可能會使用像'[我爲我在xrange(len(數字))如果digits [i] == 1] [0]'。我相信'xrange' /'range'是允許的,因爲如果沒有它,你就不會有像'for'循環這樣的基本解決方案從其他語言中知道。如果'len'也是不允許的,我會用'10'而不是'len(digits)',因爲十進制數字的數量是相當恆定的;) – Tadeck 2012-04-18 00:24:55

相關問題