据廖雪峰python3教程----python学习第九天

递归函数 ------- 在函数内部可以调用自身本身的函数

定义一个计算阶乘的函数fact(n):

fact(n) = n!
      = 1 x 2 x 3 x ... x (n-1) x n
     = (n-1)! x n
     = fact(n-1) x n

函数可以写为:

>>> def fact(n):   
       if n==1:    
          return 1
     return n*fact(n-1)
>>> fact(1)
1
>>>fact(5)
120
>>> fact(100)
93326215443944152681699238856266700490715968264381621
46859296389521759999322991560894146397615651828625369
7920827223758251185210916864000000000000000000000000

如果我们计算 fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000)

>>> fact(1000)
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
      fact(1000) 
   File "<pyshell#33>", line 4, in fact
       return n*fact(n-1)
   File "<pyshell#33>", line 4, in fact
       return n*fact(n-1)  
   File "<pyshell#33>", line 4, in fact
    return n*fact(n-1)
     。。。
     File "<pyshell#33>", line 4, in fact
     return n*fact(n-1)
    File "<pyshell#33>", line 2, in fact
        if n==1:
RuntimeError: maximum recursion depth exceeded in comparison

切片



取一个list或tuple的部分元素:

(1):

直接通过索引取值

>>> l=[‘xaioming‘,‘zhangsan‘,‘wangwu‘,‘xiaoxin‘,‘xaiohua‘]
>>> [l[0],l[1],l[2]]
[‘xaioming‘, ‘zhangsan‘, ‘wangwu‘]

(2):

通过循环取值

>>> r=[]
>>> n=3
>>> for i in range(n):
     r.append(l[i])
>>> r
[‘xaioming‘, ‘zhangsan‘, ‘wangwu‘]

(3):

通过切片:

>>> l[0:3]
[‘xaioming‘, ‘zhangsan‘, ‘wangwu‘]

l[0:3] 表示从索引0开始,知道索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素。

如果第一个索引是0,还可以省略:

>>> l[:3]
[‘xaioming‘, ‘zhangsan‘, ‘wangwu‘]

也可以从索引1开始,取出2个元素出来:

>>> l[1:3]
[‘zhangsan‘, ‘wangwu‘]

也可以倒数切片:

>>> l[-1]
‘xaiohua‘
>>> l[-2:]
[‘xiaoxin‘, ‘xaiohua‘]

创建一个0-99的数列:

>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]

取前十个元素:

>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

后十个元素:

>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

前11-20:

>>> L[11:20]
[11, 12, 13, 14, 15, 16, 17, 18, 19]

前10个数,,每两个取一个:

>>> L[0:10:2]
[0, 2, 4, 6, 8]

所有数,每5个取一个:

>>> L[0:100:5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
>>> L[:]
[0, 1, 2, 3, ..., 99]

tuple也是一种list ,只是tuple不可变。tuple也可以切片:

>>> (0,1,2,3,4,5)[:3]
(0, 1, 2)

字符串 ‘xxxxx’也可以看做一个list,每个元素就是一个字符。因此,字符串也可以切片

>>> ‘ABCDEFGHIKLMNOPQRST‘[:3]
‘ABC‘
>>> ‘ABCDEFGHIKLMNOPQRST‘[::2]
‘ACEGILNPRT‘


迭代



给定一个list或tuple,我们通过for循环来遍历这个list或tuple,这种遍历我们称为 迭代(lteration)。

Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

>>> d = {‘a‘:1,‘b‘:2,‘c‘:3}
>>> for key in d:
     print(key)
     
c
b
a

因为dict的储存不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict 迭代的是 key 。如果要迭代 value,可以用

for value in d.values()

如果要同时迭代key和value,可以用

for k,v in d.items()

由于字符串也是可迭代对象。因此,也可以作用与 for 循环:

>>> for ch in ‘ABC‘:
     print(ch)    

     
A
B
C

如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:

>>> from collections import Iterable
>>> isinstance(‘abc‘,Iterable)
True
>>> isinstance([1,2,3],Iterable)
True
>>> isinstance(123,Iterable)
False

如果要对list实现类似于 c 语言 那样的下标循环怎么办?Python内置的 enumerate 函数 可以把一个list变成索引-元素对,这样就可以在 for 循环中同时迭代索引和元素本身:

>>> for i,value in enumerate([‘A‘,‘B‘,‘C‘]):
     print(i,value)
     
0 A
1 B
2 C

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

>>> for x,y in [(1,1),(2,2),(3,3)]:
     print(x,y)
         
1 1
2 2
3 3
时间: 2024-10-11 18:06:34

据廖雪峰python3教程----python学习第九天的相关文章

据廖雪峰python3教程----python学习第六天

dict Python内置了字典,dict全程dictionary,在其他语言中也称为map,使用 键-值(key-value)储存,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用 list 实现,需要两个 list: >>> name = ['xiaoming','xiaohong','xiaolan'] >>> scores = [90,75,59] 给定一个名字,要查找对应的成绩,就要在names中找到对应的位置,再从scores取出对

据廖雪峰python3教程----python学习第七天

函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了. python的函数除了正常的定义必选参数外,还可以使用默认参数,可变参数合关键字参数, 位置参数 定义一个计算x 的平方的函数 >>> def power(x):               #参数 x 就是一个位置参数      return x**2 >>> power(5) 25 >>> power(15) 225 为了方便我们再定义一个可以计算 x 的任意次的

据廖雪峰python3教程----python学习第十一天

sorted 排序算法 Python的内置sorted()函数可以对list进行排序: >>> sorted([1,10,2,5,42,6]) [1, 2, 5, 6, 10, 42] 此外,sorted()函数也是一个高阶函数,他还可以接受一个key函数来实现自定义的排序,例如按绝对值大小排序: >>> sorted([36,5,-12,9,-21],key=abs) [5, 9, -12, -21, 36] key指定的函数将作用于list的每一个元素上,并根据ke

据廖雪峰python3教程----python学习第三天

格式化输出 Python中的格式化输出与C语言是一致的都可以用 % 来实现 eg: >>> 'hello,%s'%'world' 'hello,world' >>> 'Hi,%s,you have $%d.'%('XiaoMing',1000) 'Hi,XiaoMing,you have $1000.' % 运算符是用来格式化字符串的.在字符串内部, %s 表示用字符替换,%d表示用整数替换,有几个 %? 占位符,后面就跟几个变量 或者值,顺序要对应好.如果这有一个 %

据廖雪峰python3教程----python学习第二天

输入和输出 用print()在括号中加上字符串,就可以向屏幕输出指定的字符 eg: >>> print('hello, world') print()函数也可以接受多个字符串,字符串之间用 "," 逗号隔开 eg: >>> print('The quick brown fox', 'jumps over', 'the lazy dog') The quick brown fox jumps over the lazy dog print()会依次打印

据廖雪峰python3教程----python学习第十三天

继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 编写一个名为 Animal 的class,有一个 run() 方法可以直接打印: >>> class Animal(object):      def run(self):           print('Animal is running...') 当我们

据廖雪峰python3教程----python学习第十天

列表生成式(List Comprehensions) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)): >>> list(range(1,11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 生成[1x1,2x2,3x3,...,10x10] : >>&g

据廖雪峰python3教程----python学习第十二天

使用模块 Python本身就内置了很多非常有用的模块,只要安装安装完毕,这些模块就可以立刻使用. 我们以内建的 sys 模块为例,编写一个 hello 的模块: 'a test module'      # 一个字符串表示文档注释,任何模块代码的第一个字符串都被视为模块的文档注释 __author__='xiaoming'   #作者名 可以删除 上面的也可以不要 import sys                    #导入 sys 模块 def test():     args = sy

学习廖雪峰Python3教程的python序列化json模块的小笔记

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. Python提供了pickle模块来实现序列化. import pickle d = {"name":"Alice&quo