两个小问题。。。

两个小问题。。。

No.1   连接 任何输入的 func  我用下面方法

def n2(*Tuple):
   Lis  =  list(Tuple)

   for test in Lis :
        if  type(test) ==  int  : result = 0
        elif type(test) == str  :
              result = ''
              Lis = map((lambda nu : str(nu)),Lis)


   for x in Lis:
        result  += x
   print result

n2(2,34334,3435,5656,34343,3434)

n2('fddf','acac','egege')

n2(22,'abab',34,'dfd')

我的算法需要两个循环,,请问 能否在一个循环中完成。。

No.2 判断 任意输入数字 是否为素数。
用 while 循环 很简单

  GNU nano 1.3.8                              File: 5.py

def factor(x):
    if x <= 1 :
        print 'she must positive and bigger then 1'
    else :
       y = x // 2
       while y > 1 :
        if x % y == 0 :
            print x ,'has factor', y
            print x , 'is' , x/y ,'times of', y
            break
        else : y -= 1
       else : print x ,'is factor'

factor(1234)

但如果用for循环   却不能有正确结果(输入会有+-1的误差),
def factor(x):
    if x <= 1 :
        print 'she must positive and bigger then 1'
    else :
       y = x // 2
       state = 0
       for z in range(y,1,-1):
        if y % z  == 0 :
            print x ,'has factor', z
            print x , 'is' , x // z ,'times of', z
            state = 1
            break
       if state : pass
       else : print x , 'is factor'

factor(1234)

请问这个bug为何会出现。。。

THX。。。
第一个问题就没看懂你要做什么。一会数值一会字符串的,不知道要做什么。

第二个问题我没有运行,但:

[Copy to clipboard] [ - ]
CODE:
        if x % y == 0 :

与下面的

[Copy to clipboard] [ - ]
CODE:
        if y % z  == 0 :

感觉后一个有问题,应该是x吧。
呵呵,,,看来注释不该省略。。
第一个是这样的,,,如果n2()接受 数字 输入则 求这些数字的合, 如果接受字符串或者混合 输入。 则把这些输入连接成一个新的字符串。  

第二个 因为 有  “  for z in range(y,1,-1):”  所以 这里是z没错。   但问题是  
以 两个程序的 factor()均接受 76453 为例。

用while的输出  
76453 has factor 5881
76453 is 13 times of 5881
很正常。

但用for的却输出
76453 has factor 38226
76453 is 2 times of 38226
这不明摆着输入的 76453 被偷换成 76452 了吗?
我想不通这个偷换为何发生,特此请教。。。   
谢谢老大
第一个问题感觉有些乱。你的想法是动态判断传入的数据类型,如果为整数就求合,如果为字符串就连接。这些使用+都没有问题。但问题是字符串与整数混在一起怎么办?给我的感觉,只要有一个参数是字符串,那么整个就是字符串的联接。为什么会这样,这是你想要的吗?如果数据类型全一样要简单得多。result可以等于第一个元素,然后加上后面的元素。

第二个问题你可能没看清楚,

[Copy to clipboard] [ - ]
CODE:
if y % z  == 0 :

我说的不是后面那个z,我说的是前面那个x。因为x才是你要检查的数。而y=x//2,并不是你要检查的数。
哈哈,,,老大一语点醒梦中人。。。。。  这么明显的错误我怎么没看到啊。。。    谢谢老大。。!!

我在此基础上  做了个  while 和 for 循环的测试。
# while 循环
def factor(x):
    if x <= 1 :
        print 'she must positive and bigger then 1'  
    else :
       y = x / 2
       while y > 1 :
        if x % y == 0 :
            print x ,'has factor', y
            print x , 'is' , x/y ,'times of', y
            break
        else : y -= 1  
       else : print x ,'is factor'   
   
def timer(reps , func , *arg):
    import time
    start = time.clock()
    for i in xrange(reps):
         apply(func , arg)
    return time.clock() - start

print timer(5 , factor , 57436453)

#for 循环  
def factor(x):
    if x <= 1 :
        print 'she must positive and bigger then 1'  
    else :
       y = x // 2
       state = 0
       for z in xrange(y,1,-1):
        if x  % z is 0 :
            print x ,'has factor', z
            print x , 'is' , x/z ,'times of', z
            state = 1
            break
       if state : pass
       else : print x , 'is factor'   

def timer(reps , func , *arg):
    import time
    start = time.clock()
    for i in xrange(reps):
         apply(func , arg)
    return time.clock() - start

print timer(5 , factor , 57436453)
   
在我 pm 1.7   512 RAM  linux 2.6.12  ubuntu  5.10  的机子上
timer(5 , factor , 57436453)   
用 while 循环  用时   47.29

用 for 循环  用时   33.68
# 如 for循环中  用 range建立循环表   在小数值 时 比 xrange 效率高。  但在大数值时,比如说 上面这个。 由于要建立一个巨大的 list 。  此程序将 用光全部系统 Ram +swap 直到 数据溢出 linux强制关闭它为止。  运行期间  由于 巨量的 IO操作 , 鼠标键盘都不灵了,感觉和死机 无异,, ,幸好最后 被自动killed

如果有人 能用c写一个 同样的程序 ,传递同样的参数,试验python相对 c的 性能损失。  我觉得一定很有趣 。