python 3函数,其中一个参数返回整数列表

时间:2017-12-06 15:51:10

标签: python-3.x function

如果're'函数必须只接收一个参数's'并且必须返回一个包含从1到12的数字(整数)的列表,它应该是什么样子。 (例如)?

因此交互式控制台中的结果必须是:

>>> re(12)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

2 个答案:

答案 0 :(得分:3)

首先你错误地使用了def,如果你想定义你必须输入:并在下面的附加缩进中定义函数,或者如果你想使用函数,你必须删除{ {1}}。

Python内置range()不可变序列类型,需要一到三个参数开始停止步骤,在这种情况下,我们只会使用前两个。但是要获取列表,我们还需要使用另一个内置的,即可变序列类型 - list(),您可以在here中阅读有关列表的更多信息。我们将使用list()作为类型构造函数:deflist(),如内置类型页面中所指定:

  

列表可以通过多种方式构建:

list(iterable)
     

构造函数构建一个列表,其项目相同且相同   订购可迭代的项目。 iterable可以是序列,a   支持迭代的容器或迭代器对象。如果可迭代的话   已经是一个列表,一个副本被制作并返回,类似于   可迭代[:]。例如,list('abc')返回['a','b','c']和   list((1,2,3))返回[1,2,3]。如果没有给出任何论据,那么   构造函数创建一个新的空列表,[]。

现在我们了解了Using a pair of square brackets to denote the empty list: [] Using square brackets, separating items with commas: [a], [a, b, c] Using a list comprehension: [x for x in iterable] Using the type constructor: list() or list(iterable) 的工作原理,我们可以回到list()用法:

  
      
  • 范围构造函数的参数必须是整数(内置int或任何实现索引特殊的对象   方法)。如果省略step参数,则默认为1.如果   start参数被省略,默认为0.如果step为零,   引发了ValueError。

  •   
  • 对于正步骤,范围r的内容由公式r [i] = start + step * i确定,其中i> = 0且r [i] <1。停止。

  •   
  • 对于否定步骤,范围的内容仍由公式r [i] = start + step * i确定,但约束   是i> = 0且r [i]>停止。

  •   
  • 如果r [0]不符合值约束,则范围对象将为空。范围确实支持负指数,但这些指数   被解释为从序列的末尾开始的索引   积极的指数。

  •   
  • 允许使用大于sys.maxsize的绝对值的范围,但某些功能(例如len())可能会引发OverflowError。

  •   
     

范围示例:

range()
     

范围实现除串联和重复之外的所有常见序列操作(由于范围对象可以   仅表示遵循严格模式和重复的序列   连接通常会违反该模式。)

     
      
  • 开始:   start参数的值(如果未提供参数,则为0)
  •   
  • 停止:   stop参数的值
  •   
  • 步骤:   step参数的值(如果未提供参数,则为1)
  •   

许多其他操作也会生成列表,包括sorted()内置。

您的问题的答案如下:

>>>
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]

答案 1 :(得分:0)

  1. 我会避免使用“re”作为函数名,因为re也是正则表达式的python库。

  2. Lycopersicum的答案很好地解释了范围(),这是解决问题的最快,最直接的方式。一般来说,最好使用Python的内置函数,因为它将使用Python的编译C代码而不是较慢的Python代码。

  3. 我只是想知道为什么要使用Range()。

    因此,还有其他方法可以生成数字列表。首先使用循环直接生成列表。

    def listOfNumbers (number):
      start = 1
      listOf = []
      while (start <= number):
        listOf.append(start)
        start = start + 1
        return listOf
    

    在这种情况下,您只需使用listOfNumbers(12),您就会得到一个数字列表。但是,这会将一个列表存储在内存中并且速度很慢,因此对于非常大的数字而言并不好。

    另一方面,您可以使用生成器(非常类似于range())。生成器不会将数据存储在列表中。相反,它只是一次“产生”一个数字,直到代码停止。它快得多:

    def generatorOfNumbers (number):
     start = 1
     while start <= number:
       yield start
       start += 1
    

    然后您可以将其称为生成列表的两种方法之一:

    def listFromGenerator1 (number):
      return [x for x in generatorOfNumbers(number)]
    
    def listFromGenerator2 (number):
      return list(generatorOfNumbers (number))
    

    当我计算这些方法时,我得到了。

    timed(listOfNumbers) # time for list of 10000
    ... 
    Elapsed Time: 2.16007232666
    Elapsed Time: 1.32894515991
    Elapsed Time: 2.09093093872
    Elapsed Time: 1.99699401855
    Elapsed Time: 3.2000541687
    
    ...   timed(listFromGenerator1)
    ... 
    Elapsed Time: 1.33109092712
    Elapsed Time: 1.30605697632
    Elapsed Time: 1.93309783936
    Elapsed Time: 1.79386138916
    Elapsed Time: 1.90401077271
    
    ...   timed(listFromGenerator2)
    ... 
    Elapsed Time: 0.869989395142
    Elapsed Time: 1.08408927917
    Elapsed Time: 1.65319442749
    Elapsed Time: 1.53398513794
    Elapsed Time: 1.36089324951
    
    ...   timed(listFromRange)  # Lycopersicum's approach
    ... 
    Elapsed Time: 0.346899032593
    Elapsed Time: 0.284194946289
    Elapsed Time: 0.282049179077
    Elapsed Time: 0.295877456665
    Elapsed Time: 0.303983688354
    

    总之,总是尽可能使用内置函数,而不是尝试构建自己的函数。这包括list()与列表理解的(轻微)偏好。