列表(list)

基本操作

比如说我要整理一个近期热映的电影列表:

  1. movies = ["venom", "My Neighbor Totor", "Aquaman"]
  2. print(movies)
  3. # ['venom', 'My Neighbor Totor', 'Aquaman']
  4. print(len(movies))
  5. # 3
  6. print(movies[1])
  7. # My Neighbor Totor

列表很像数组,但功能超越数组。列表都是从0开始的,python中列表无需事先声明类型。

从列表后面加上一个新的元素,比如说加个“无名之辈”,是append方法。

  1. movies.append('A Cool Fish')
  2. print(movies)
  3. # ['venom', 'My Neighbor Totor', 'Aquaman','A Cool Fish']

删除列表最后一个元素:pop方法。

  1. movies.pop()
  2. print(movies)
  3. # ['venom', 'My Neighbor Totor']

两个列表相衔接,用的是extend方法。

  1. movies.extend(['Dying To Survive', 'Detective Conan'])
  2. print(movies)
  3. # ['venom', 'My Neighbor Totor', 'Aquaman', 'Dying To Survive', 'Detective Conan']

我想在某个条件下删除一个元素,同时加上一个元素,涉及removeinsert方法。

  1. movies.remove('venom')
  2. print(movies)
  3. # ['My Neighbor Totor', 'Aquaman']
  4. movies.insert(len(movies),'venom')
  5. print(movies)
  6. # ['My Neighbor Totor', 'Aquaman','venom']

python中列表可以放任何类型的数据。

循环

处理列表需要各种迭代方法。是时候用for...in循环了

  1. for movie in movies:
  2. print(movie)
  3. # venom
  4. # My Neighbor Totor
  5. # Aquaman

同理while循环也是可以的

  1. count=0
  2. while count<len(movies):
  3. print(movies[count])
  4. count+=1

一般都推荐for循环

列表当然也能嵌套,我们可以用isinstance方法检测之:

  1. movies = ["venom", ["My Neighbor Totor", "Aquaman"]]
  2. print(isinstance(movies,list))
  3. # True

if else

如果我想把这个嵌套列表单独打印出来,可以这么操作

  1. movies = ["venom", ["My Neighbor Totor", "Aquaman"]]
  2. for movie in movies:
  3. if isinstance(movie, list):
  4. for _movie in movie:
  5. print(_movie)
  6. else:
  7. print(movie)
  8. # venom
  9. # My Neighbor Totor
  10. # Aquaman

函数与递归:多层嵌套的扁平化

给这个列表再加一层:

  1. movies = ["venom", ["My Neighbor Totor", ["Aquaman"]]]

用上节来处理多层嵌套,会导致大量重复而不优雅的代码。

首先使用函数让代码更加优雅:

  1. movies = ["venom", ["My Neighbor Totor", ["Aquaman"]]]
  2. def flatten(_list):
  3. if(isinstance(_list, list)):
  4. for _item in _list:
  5. flatten(_item)
  6. else:
  7. print(_list)
  8. flatten(movies)

为了巩固所学:再举一个通过递归生成斐波拉契数列第N项的例子:

斐波那契数列(Fibonacci sequence),指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)

  1. def fib(n):
  2. if n < 1:
  3. return 'error'
  4. if n == 1 or n == 2:
  5. return 1
  6. else:
  7. return fib(n-1)+fib(n-2)
  8. print(fib(6))
  9. # 8

虽然很简洁,但是n>100就报错了。因为python的递归支持100层

函数

模块化开发

把上一章的flatten函数单独用base.py存起来,它就打包为一个模块。

除了之前提到的,用#注释,还可以用三重"""作为python的注释。

再同一个命名文件夹下重新创建一个app.py文件:

  1. import base as util
  2. movies = ["venom", ["My Neighbor Totor", ["Aquaman"]]]
  3. print(util.flatten(movies))
  4. # 预期结果

列表更多的内置方法

先学习以下内置的方法(BIF)

  • list() :工厂函数,创建一个新的列表
  • next() : 返回一个迭代结构(如列表)中的下一项
  • id() :返回一个数据对象的唯一标识(内存地址)
  1. >>> id(b)
  2. 140588731085608
  • int() :将一个字符串如'5'转化为5
  • range() :返回一个迭代器,根据需要生成一个指定范围的数字
  1. >>>range(10) # 从 0 开始到 10
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  3. >>> range(1, 11) # 从 1 开始到 11
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  5. >>> range(0, 10, 3) # 步长为 3 , 迭代终点不超过10
  6. [0, 3, 6, 9]
  • enumerate() :把单个数组创建为带有索引号的成对列表
  1. >>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
  2. >>> list(enumerate(seasons))
  3. [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
  4. >>> list(enumerate(seasons, start=1)) # 下标从 1 开始
  5. [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

升级你的模块:参数

扁平化打印只能看到每个数组最小的元素,考虑用缩进来体现彼此的关系。那怎么做呢?

提示:用range方法实现。

事实上在打印时只需要知道每次迭代的深度,就好处理了。因此需要引入第二个参数

  1. # base.py
  2. def flatten(_list,level=0):
  3. if(isinstance(_list, list)):
  4. for _item in _list:
  5. flatten(_item,level+1)
  6. else:
  7. for step in range(level):
  8. print("\t", end='')
  9. print(_list)
  1. # app.py
  2. import base as util
  3. movies = ["venom", ["My Neighbor Totor", ["Aquaman"]],
  4. ["My Neighbor Totor", ['000',["Aquaman"]]], 'aaa', ['Aquaman'],'sadas']
  5. print(util.flatten(movies))

效果出来了。但还有不满意的地方。如果要兼容过去的写法怎么办?

  1. def flatten(_list, count=False, level=0):
  2. if(isinstance(_list, list)):
  3. for _item in _list:
  4. flatten(_item,count,level+1)
  5. else:
  6. if count:
  7. for step in range(level):
  8. print("\t", end='')
  9. print(_list)
  10. else:
  11. print(_list)

调用时默认就是不缩进。

hand first python 选读(1)的更多相关文章

  1. head first python选读(5)

    python web 开发 犯了低级错误,这本书看了一半了才知道书名应为<head first python>,不是hand first.. 现在开始一个web应用. 总算是熟悉的内容了. ...

  2. hand first python 选读(2)

    文件读取与异常 文件读取与判断 os模块是调用来处理文件的. 先从最原始的读取txt文件开始吧! 新建一个aaa.txt文档,键入如下英文名篇: Li Lei:"Hello,Han Meim ...

  3. python之进程与线程

    什么是操作系统       可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...

  4. python之面相对象程序设计

    一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 面向对象的程序设计:路飞学院版 ...

  5. Python 中的实用数据挖掘

    本文是 2014 年 12 月我在布拉格经济大学做的名为‘ Python 数据科学’讲座的笔记.欢迎通过 @RadimRehurek 进行提问和评论. 本次讲座的目的是展示一些关于机器学习的高级概念. ...

  6. Python基础-week06 面向对象编程基础

    一.面向对象编程 1.面向过程 与 面向对象编程 面向过程的程序设计: 核心是 过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式 ...

  7. 送书福利| Python 完全自学手册

    前言 这里不讨论「能不能学,要不要学,应不应该学 Python」的问题,这里只会告诉你怎么学. 首先需要强调的是,如果 Python 都学不会,那么我建议你考虑别的行业,因为 Python 之简单,令 ...

  8. Python 爬虫系列

    爬虫简介 网络爬虫 爬虫指在使用程序模拟浏览器向服务端发出网络请求,以便获取服务端返回的内容. 但这些内容可能涉及到一些机密信息,所以爬虫领域目前来讲是属于灰色领域,切勿违法犯罪. 爬虫本身作为一门技 ...

  9. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

随机推荐

  1. html table表格列数太多添加横向滚动条

    HTML的table表格的列数如果太多或者某一列的内容太长,就会导致表格td的内容被挤压变形,对后台的使用体验非常不友好.比如下面的情况: 那么如何在表格列数较多的情况下添加横向滚动条?其实很简单,只 ...

  2. libxml2 在mingw中 xmlfree连接错误问题

    libxml2 在mingw中 xmlfree连接错误问题 2013年10月02日 ⁄ 综合 ⁄ 共 1527字 ⁄ 字号 小 中 大 ⁄ 评论关闭 原地址:http://blog.csdn.net/ ...

  3. Maven打包部署

    Maven打Jar包 问题一 Eclipse突然SB告诉我类不存在还让我导包进来O__O "…,但是我明明有这个类.这是不要慌,通过在网上搜索得知:由于eclipse的编译是基于时间戳的判断 ...

  4. rem值计算------移动端开发计算方式

    移动端开发: <meta name="viewport" content="width=device-width, initial-scale=1, maximum ...

  5. 【源码分享】仿网易客户端源码效果 apkbus的~

    http://www.apkbus.com/forum.php?mod=viewthread&tid=184867 内容我就不说了,直接点开看吧.

  6. 【Maven】在intellij里,体验Maven

    1:配置Maven 从官网下载,然后将bin目录添加到系统变量Path中, 在cmd窗口,输入mvn,有执行反馈即配置成功. 配置conf/settings.xml文件,指定仓库中心下载到本地的目录 ...

  7. 20145316 《Java程序设计》第8周学习总结

    20145316 <Java程序设计>第8周学习总结 教材学习内容总结 NIO&NIO2 NIO使用频道(channel)衔接数据节点,对数据区的标记提供了clear(),rewi ...

  8. selenium 之定位方法

    1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...

  9. SDUT OJ 2607

    /*http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2607*/ 题目大意:给出一个字符串,求出里 ...

  10. USBasp制作资料及全过程(菜鸟版)

    源:USBasp制作资料及全过程(菜鸟版) 一.usbasp 的一般性介绍: 1.下载线,是“ISP”(In System Programmability:“在系统编程”)或“IAP”(In Appl ...