On Mon, 15 Sep 2014 16:59:36 +1000, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote:
>Seymore4Head wrote: > >> import random >> nums=range(1,11) >> print (nums) >> samp=random.sample(nums,10) >> top=nums >> newlist=nums[::-1] >> tail=newlist >> >> for x in range(10): >> print ("Top {:2d} Tail {:2.0f} Sample {:2d} >> ".format(top[x],tail[x],samp[x])) >> >> I don't understand why the command nums=range(1,11) doesn't work. > >Of course it works. It does exactly what you told it to do: set the >variable "nums" to the result of calling range(1, 11). The only question >is, what does range(1, 11) do? > > >> I would think that print(nums) should be 1,2,3 ect. >> Instead it prints range(1,11) > >Did you read the documentation for range? > >py> help(range) >class range(object) > | range([start,] stop[, step]) -> range object > | > | Returns a virtual sequence of numbers from start to stop by step. > [...] > >range in Python 3 does not return a list. It returns a special object which >provides a sequence of numbers, but without actually storing them all in a >list. > > >> Why does random.sample(nums,10) give me the numbers between 1 and 10. > >What did you expect it to do? Did you read the documentation? > > >py> import random >py> help(random.sample) >Help on method sample in module random: > >sample(self, population, k) method of random.Random instance > Chooses k unique random elements from a population sequence or set. > [...] > To choose a sample in a range of integers, use range as an argument. > This is especially fast and space efficient for sampling from a > large population: sample(range(10000000), 60) > >The docs even tell you that (1) sample supports range objects, and (2) using >range is more efficient than lists. > > >> I am missing something subtle again. > >range objects behave *like* lists when you index them: > >py> nums = range(1, 100) >py> nums[0] # First item. >1 >py> nums[-1] # Last item. >99 > >They're even smart enough that you can take a slice, and they give you a new >range object: > >py> nums[1:10] >range(2, 11) > >When you iterate over them, you get each item in turn: > >py> for i in range(1, 4): >... print(i) >... >1 >2 >3 > >range objects are more efficient than lists if the numbers follow the right >sort of pattern. While a list can contain any values you like, in any >order: > >py> nums = [1, 33, 5, 222, 4, 6, 0, 8888888, 7] > >range objects are limited to a linear sequence of: > >start, start+step, start+2*step, start+3*step, ... > >up to some end value. The reason range is more efficient is that, unlike >lists, it doesn't need to pre-populate all the values required, it can >calculate them on the fly when and as required. The reason why lists are >more flexible is that the values don't have to be calculated as needed, >they can just be stored, ready to use. I see now Thanks everyone -- https://mail.python.org/mailman/listinfo/python-list