第五天
递归(recursion):
什么是递归:
函数自身调用自身
注意:递归必须存在终止条件,如果没有终止条件递归是一个死循环 ,下图的if语句就是终止条件
在java等编程语言,如果递归没有终止条件,或者递归的层数太深,则可能出现Stack Overflow Error错误,该错误表示栈溢出错误(栈的内存空间不够了)
但是python、JavaScript等编程中,一般都会规定递归的层数,默认都是1000层也可以修改默认的层数:
import sys
sys.getrecursionlimit() # 获取默认的递归层数
sys.setrecursionlimit(num) # 重新设置递归的最深层数
递归的实例
斐波那契数列(从第三项开始,此项等于前两项之和)
注:递归的深度最好不要超过30,本人的电脑递归到30就是极限了,深度为40 cmd卡死
容器:
变量这种存储单个数据的容器,也会提供存储多个数据容器
线性容器:
数组(Array):连续内存
链表(List):python list的容器,底层使用的就是双向链表结构
栈(Stack):先进后出
队列(queue):先进先出
hash表(哈希表)
list:
列表,是一种线性结构的容器,底层使用的双向链表结构设计
定义一个list容器:
利用弱数据类型语言的特点:直接将[]这种列表数据赋给变量,则变量就是list类型
ls = [1, 2, 3, 3, 445]
也可以使用全局函数list
ls = list()
ls = list([1, 2, 3, 3, 445])
访问列表中的元素:
因为list是有序的线性结构,因此每一个都是存在下标(索引)的,所以可以直接通过下标来访问
列表对象[下标] # 获取变量对应的元素
注意:下标从0开始
得到list中的元素个数:
len(列表对象) # 返回对象的元素个数
列表的遍历:
for 临时变量 in 容器:
每一次循环得到一个元素,被保存到临时变量中,也可以使用while,通过索引获取
list列表的常见方法:
dir(模块/对象) # dir全局函数可以打印输出模块或者对象的方法或者属性
help(方法) # 返回帮助文档
['append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
|-- append(新元素) # 在尾部添加新元素
|-- insert(index, 新元素) # 在index位置添加新元素
|-- extend(列表) # 合并列表
|-- clear() # 清空列表
|-- pop() # 删除最后一个元素,并返回它
|-- remove(元素) # 删除对应的元素
|-- index(元素) # 返回元素的下标索引
|-- count(元素) # 统计某个元素在列表中的数量
|-- reverse() # 翻转列表
|-- sort() # 数据的类型必须相同
|-- copy() # 复制list对象
Append 的使用
Insert的使用
Extend的使用
Index 的使用
Sort ——排序(默认升序排列)
降序排列
set(集合):
set是一种无序的集合,是一种hash表(哈希表)的实现,所以具备如下特点:
1、无序
2、不重复
定义一个set:
s = {必须有元素} # 注意,不要使用空的{},这样定义的是dict
常见方法:
['add', 'clear', 'copy', 'difference', 'difference_update',
'discard', 'intersection', 'intersection_update', 'isdisjoint',
'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference',
'symmetric_difference_update', 'union', 'update']
|-- add(新元素) # 添加新的元素
|-- clear() # 清空集合
|-- copy() # 浅拷贝set
|-- difference() # 求两个集合的差集
|-- union # 求两个集合的并集
|-- intersection # 求两个集合的交集
|-- remove() # 移除元素,如果该元素不存在,则抛出错误
|-- pop() # 随机移除一个元素
|-- discard() # 移除元素,如果该元素不存在,则什么都不做
Union —— 并集
Intersection —— 交集
tuple(元组):
不可变数据类型,类似于其他编程语言中的枚举类型
代表一组固定不变的
|-- index(元素) # 返回元素的下标索引
|-- count(元素) # 统计某个元素在列表中的数量
dict(字典):
['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
字典的遍历方式:
d = {"name":"神奇海螺","age"=18,"address":"比基尼海滩"}
d.get{"name"}
"神奇海螺"
d["age"]=17
d
{"name":"神奇海螺","age"=17,"address":"比基尼海滩"}
d.keys()
dict_keys(["name","age","address"])
d.values()
dict_values(["神奇海螺",17,"比基尼海滩"])
d.items()
dict_items([("name","神奇海螺"),("age",17"),(address","比基尼海滩")])
for k in d:
print(k)
name
age
address
for k in d:
print(k,d[k])
name 神奇海螺
..........
for key,value in d.items():
print(key,value)
name 神奇海螺
..........
for key,value in d.items():
print(res[0],res[1])
name 神奇海螺
age 17
..........
作业要求:
作业1:有一堆硬币,每次只能拿一个或者两个,求最少多少次可以拿完硬币
[10, 8, 5, 3, 27, 99]
作业2:如果两个素数之差为2,这样的两个素数就叫作"孪生数",找出100以内的所有"孪生数".
作业3:给定一个列表,求最大值(不能使用系统api),求最小值,求平均值、求和
作业4:将list中的重复数据去重,至少使用两种方案
作业5:两个列表进行合并操作
作业6: 使用列表判断一个列表是否在另外一个列表中
作业7:列表的反转 列表的排序
作业8:如何将0-10随机存入列表中
作业9:完成一个登录注册案例(要求使用容器保存数据)
作业结果
1
2
3
4
5
6
8
9