1.我和python的第一次亲密接触

Python3 与Python2* 的区别

Python3 可以给变量命名中文名

2.用Python设计的第一个游戏

注意Tab的运用

流程图的重要性(logic)

内置函数(built-in functions 简称BIF)(通过import调入)

In addition:

Python程序内不需要事先声明变量,可以直接赋值使用

另外需要注意if和else语句的使用方法, 注意 “ :”

赋运算符值"="和比较运算符 "==" 的区别。

3.插曲之变量与字符串

变量:

由字母、数字、下划线组成,且首位不允许是数字

字符串:

转义字符

原始字符串:

在Python中,反斜杠主要用来作为转义字符的,当我们需要用其本身含义时,可以对其自身前面加一个转义字符处理。但是对于一些特殊的字符串,如果里面频繁用到反斜杠,再手动的去一个个加就显得繁琐,这个时候可以在其字符串前面加上一个字母r轻松解决,这就是原始字符串的含义,让字符串中的反斜杠回归其原始的本意。例如字符串C:\Program File\Intel\WiFi\Help,定义只要r'C:\Program File\Intel\WiFi\Help',它的实现方法其实很简单,就是程序会自动对每一个反斜杠前面再加一个反斜杠。但是r不能对末尾是反斜杠的字符串进行定义,'C:\Temp\'。这个时候如果非要使用r进行原始字符串操作的话可以采用如下形式解决:r'C:\Temp' '\' 或者r'C:\Temp'+'\'。

长字符串:

一般情况下,使用单引号或者双引号只能引一行的字符串,如果字符串是有多行组成,则需要使用三引号

4.改进我们的小游戏

Python “and”和C “&&” 有什么区别

在c中,0&&3 = 0,1&&3 = 1在python中,,0 and 3 = 0,1 and 3 = 3!

短路逻辑(short-circuit logic)

逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。 这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用与 or 操作符。

5.闲聊之Python的数据类型

基本数据类型:

int (整型)

在Python3中长整形和整形归为一类,所有的整数都属于整型,例如1,0,1000,1203等等

float (浮点型)

数字中有小数点的数,如12.1 1.85 10.0 等等,另外1e10也表示浮点数

str (字符串)

所有以单引号或双引号括起来的值都叫做字符串,例如“小甲鱼”

bool (布尔型)

布尔类型只有两个值,True 或False ,记得在Python里面这两个值首字母均大写。

e记法-> 科学计数法

0.000000000000135用e记法表示为1.35e-13,它是一个浮点数类型

数据类型转换

整型强制转换函数 int()

可以将纯数字的字符串或浮点型强制转换为整形,如int('0012')为12; int(12.5)为12 -> 截断大法

若要“四舍五入”取整,则须:

5.4 “四舍五入”结果为:5,int(5.4+0.5) == 5  5.6 “四舍五入”结果为:6,int(5.6+0.5) == 6

浮点型强制转换函数float()

可以将包含一个小数点的数字字符串或者整形转换为浮点型,如float('0012')为12.0, float('.123')为0.123; float(12)为12.0 字符串强制类型转换函数str(),可以将任何类型转换为字符串类型,例如str(1e28)为‘1e+28' str(1e2)为'100.0'等等

数据类型信息获取

函数type()

直接给出数的数据类型,例如type(12.0)则返回float,type(1000)返回int, type(False)返回bool等

函数isinstance()

需要给出需要判断的数和一个数据类型,是则返回True,否则返回False,如isinstace(1,int)返回 True ,isinstance(12.5,float)返回True,isinstance('I love u',float)返回False,而isinstance('I love u',str)返回True

s为字符串   s.isalnum()  所有字符都是数字或者字母,为真返回 Ture,否则返回 False。   s.isalpha()   所有字符都是字母,为真返回 Ture,否则返回 False。   s.isdigit()     所有字符都是数字,为真返回 Ture,否则返回 False。   s.islower()    所有字符都是小写,为真返回 Ture,否则返回 False。   s.isupper()   所有字符都是大写,为真返回 Ture,否则返回 False。   s.istitle()      所有单词都是首字母大写,为真返回 Ture,否则返回 False。   s.isspace()   所有字符都是空白字符,为真返回 Ture,否则返回 False。

Exercise

1. 写一个程序,判断给定年份是否为闰年。(注意:请使用已学过的 BIF 进行灵活运用)   这样定义闰年的:能被4整除但不能被100整除,或者能被400整除都是闰年。   

6.Python之常用操作符

算术运算符

加(+),减(-),乘(),除(/),幂运算(*),地板除(//)

/和//的区别

在Python中的除运算符与其它程序语言的不太一样,/表示真正的除号,例如1/3=0.3333333333333333,而4/2的值为2.0。说明两个数相除的值是一个浮点数,而其它程序语言/却表示两个整数相除,只返回一个整数。Python后来为了兼容这种用法,引入了//来实现。例如3//2的值为1,而3.0//2的值为1.0,且3//2.0的值也为1.0。说明在Python中//符号两边同为整数时的值才为整数,否则则为一个浮点数(后面带'.0')。

**运算符与负号(-)运算符的优先级问题

在Python中,‘-’在一个数字前面表示成负号,例如-3,-5.12等。**在-的右边时,其优先级高于-,例如-2**2相当于-(2*2)等于-4,而当其在右边时优先级低于-,如2**-2则相当于2*(-2)等于0.25.

允许运算符与等号一起使用,表示变量本身参加运算并重新赋值给变量,例如 x =5,x+=5后,x的值为10

逻辑操作符

and

x and y 的值计算过程为先判断x的值,如果为0则返回0,否则返回y的值, 例如 3 and 4 值为4;0 and 4 值为0

or

x or y 的值计算过程为先判断x的值,如果为0则返回y的值,否则返回x的值,例如 3 or 4的值为 3;0 or 4的值为4

not

not x 的值的计算过程为先判断x的值,如果为0则返回True,否则返回False 例如 not 0的值为True; not 0.12 值为False

优先级

三者的优先级 not > and >or

比较运算符

< <= > >= == !=

返回值为bool型

赋值运算符

=

Python中允许 x=y=z=2,表示x,y,z的值均为2

运算符优先级

几元运算符指的是运算符的操作数有几个;一般而言优先级上一元运算符高于二元运算符,算数运算符优先级>比较运算符>逻辑运算符

Exercise

0. 请写一个程序打印出 0~100 所有的奇数。    1. 我们说过现在的 Python 可以计算很大很大的数据,但是......真正的大数据计算可是要靠刚刚的硬件滴,不妨写一个小代码,让你的计算机为之崩溃?    9- 2. 爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。 (小甲鱼温馨提示:步子太大真的容易扯着蛋~~~)   题目:请编程求解该阶梯至少有多少阶?  (119)

7.了不起的分支和循环1

8.了不起的分支和循环2

if 的三种用法

#1
score = int(input("请输入一个分数:"))
if 100 >= score >= 90:
        print("A")
if 90 > score >= 80:
        print("B")
if 80 > score >= 70:
        print("C")
if 70 > score >= 60:
        print("D")
if 60 > score:
        print("E")
if score > 100:
    print("输入错误!")

#2
score = int(input("请输入一个分数:"))
if 100 >= score >= 90:
        print("A")
else:
    if 90 > score >= 80:
            print("B")
    else:
        if 80 > score >= 70:
                print("C")
        else:
            if 70 > score >= 60:
                    print("D")
            else:
                if 60 > score:
                        print("E")
                else:
                    if score > 100:
                        print("输入错误!")

#3
score = int(input("请输入一个分数:"))
if 100 >= score >= 90:
        print("A")
elif 90 > score >= 80:
        print("B")
elif 80 > score >= 70:
        print("C")
elif 70 > score >= 60:
        print("D")
elif 60 > score:
        print("E")
elif score > 100:
    print("输入错误!")

三元运算符

3 if 4>3 else 4 值为3,而3 if 4<3 else 4 的值为4

断言语句assert

assert后面跟一个条件表达式,如果条件表达式的值为假时,程序自动崩溃并报异常AssertionError,如果为真则继续执行后面的语句,主要用于在程序中植入检查点,只有assert后面的条件永远为真时程序才能正常运行,否则就崩溃。例如 assert 3>4,程序就会执行这一条语句后崩溃并报出异常,而assert 4>3则正常执行

Exercise

  1. 视频中小甲鱼使用 if elif else 在大多数情况下效率要比全部使用 if 要高,但根据一般的统计规律,一个班的成绩一般服从正态分布,也就是说平均成绩一般集中在 70~80 分之间,因此根据统计规律,我们还可以改进下程序以提高效率。

题目备忘:按照100分制,90分以上成绩为A,80到90为B,60到80为C,60以下为D,写一个程序,当用户输入分数,自动转换为ABCD的形式打印。

  1. Python 的作者在很长一段时间不肯加入三元操作符就是怕跟C语言一样搞出国际乱码大赛,蛋疼的复杂度让初学者望而生畏,不过,如果你一旦搞清楚了三元操作符的使用技巧,或许一些比较复杂的问题反而迎刃而解。 请将以下代码修改为三元操作符实现:
1. x, y, z = 6, 5, 4 
2. if x < y: 
3.     small = x 
4.     if z < small: 
5.         small = z 
6. elif y < z: 
7.     small = y 
8. else: 
9.     small = z

成员资格运算符: in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。

Python支持a<b<c,相当于a<b and b<c(与C语言不同)

9.了不起的分支和循环3

while

i = 0      
while i<3:       # 条件是i的值小于3,当满足此条件时循环体会一直被执行下去
        print(i,end=' ')          #循环体,打印出i的值
        i += 1

while循环中首先判断条件是否成立,成立则执行循环体,然后再次判断条件是否成立,如此循环下去直到条件不成立

for

member =['小甲鱼','小布丁','黑夜','醉酒青牛']                 #member是一个列表变量
for each in member:                                                      #each是一个迭代变量 
        print(each,len(each),end=' ')
#在这里,目标指的的每次迭代的变量的值,表达式一般是序列(字符串,列表,元组等)

Python中的for与其他类C语言的比较(如c++,c#)

range()

生成一个数字序列的内置函数,经常作为for循环的表达式存在,其形式是range([start,] stop [step=1]) range(5) ->0~5

range(1, 9) ->1~9 即[1,9)

step ->每次递增几

break

break是结束所在循环(即只能跳出一层循环)

continue

continue是结束本轮循环并判断循环条件

Exercise

  1. 设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含"*"则不计算在内。

  2. 编写一个程序,求 100~999 之间的所有水仙花数。

如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。

python for i in range(100,1000): sum = 0 temp =i while temp: sum = sum + (temp%10) **3 temp //=10 if sum == i: print(i) #说实话,我一开始只想到”个十百“一个个遍历来算……

  1. 三色球问题

有红、黄、蓝三种颜色的求,其中红球 3 个,黄球 3

个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。

10.列表,一个打了激素的数组1

列表内插入新元素的方法

方法的调用形式: 列表.append(‘ ’)

append() 将参数作为一个元素增加到列表的末尾

extend() 是将参数作为一个列表去扩展列表的末尾

insert()

insert(位置,元素) 从0开始

Exercise

0. 自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好?   假设给定以下列表:   member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']   要求将列表修改为:   member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]   方法一:使用 insert() 和 append() 方法修改列表。   方法二:重新创建一个同名字的列表覆盖。 1. 利用 for 循环打印上边 member 列表中的每个内容

11.列表,一个打了激素的数组2

通过索引值获得列表中的元素

从0开始

从列表中删除元素的方法

remove()

member.remove('黑夜') 若删除元素不在列表里,则会报错

pop()

不给出参数,直接返回列表中最后一个元素并从列表中删除

也可以给出索引值参数,直接返回该索引值对应元素并从列表中删除。例如继续执行member.pop(0)

del语句

del member[2]

列表分片

列表名[左索引值:右索引值:步长]

另外,python支持负数索引,-1相当于列表中右侧第一个元素值,以此类推。步长也允许为负值

列表拷贝

通过将已知列表名直接赋值给一个变量和通过分片操作及列表内置方法copy()赋值给一个变量新建一个列表的本质区别:前者两个变量指向通一个数据存储空间,存储空间内数值发生变化,则两者均改变;后者相当于重新建立了一个存储空间,里面的数据不受其他空间内数值变化影响。

List1 = [1,2,3,4,5,6]

List2 = list[:]

12.列表,一个打了激素的数组3

常用操作符

比较操作符

两个含有两个数字元素的列表直接比较大小 list1>list2得到的值为False。在Python中会直接取两个数组的第0个元素进行比较,如果相等则继续对列表下一个元素进行比较,不相等则给出False或者True的值。这里面需要注意:元素的值必须符合比较运算符的适用范围,例如可以是两个数字进行对比,也可以是两个字符进行对比。

逻辑操作符

拼接操作符 +

重复操作符 *

成员关系操作符 in / not in

列表的内置方法

clear()

用于删除列表中的所有元素,形成一个空的列表,例如: list1 = [123,456,789] list1.clear() 的值为[],一个空的列表

copy()

用于浅拷贝一个列表,例如: list1 = [123,456] list2 = list1.copy() 则list2的值也变为[123,456]它的功能和列表分片功能 list2 = list1[:]作用是一样的;他们两个与赋值运算符=是有区别的,前者是在内存中重新申请一个空间并存放列表的值,而=则是将列表的地址直接赋值给了另一个列表,举例说明两者带来的区别: list1 = [1,3,5] list2 =list1 list3 = list1.copy() list1.append('醉酒青牛'),则list1的值变为[1,3,5,'醉酒青牛'],而list3的内容仍为[1,3,5]

count()

用于统计所需参数在列表中出现的次数,例如: list1 = [1,3,1,4,1,5,1,10] 则list1.count(1)的值为4,而list1.count(100)的值为0。

index()

L.index(value, [start, [stop]])

用于寻找所输入参数在列表中的第一个位置并返回该位置值,还有两个参数可以确定寻找该值的的列表范围,例如: list1 = [1,3,1,4,1,5,1,10] list1.index(1)则返回0,而list1.index(1,2,4)则返回2,而list1.index(100)则报错,因为100不存在该列表中

reverse()

将列表中所有元素倒置,例如 list1 = [1,2,3,4,5] list1.reverse()的值为[5,4,3,2,1]

sort()

L.sort(key=None, reverse=False)

这是一个比较重要的函数,其有三个参数值,前两个分别是指定排序算法和算法搭配的关键字,我们现在不去管这两个值,最后一个是reverse =False,说明默认状态下sort是按照从小到大进行排序,如果想改为从大到小则将reverse=True,例如 list1 = [12,7,9,15,18,4] list1.sort()的值为[4,7,9,12,15,18] 而执行list1.sort(reverse=True)的值为[18,15,12,9,7,4] 变为了从大到小排序。

列表推导式/列表解析

列表推导式(list comprehensions)也叫列表解析,灵感取自于函数式编程语言Haskell,可以用来动态创建列表。其一般形式如下: (有关的A的表达式 for A in B ): 举例说明:

>>> list1 = [x**2 for x in range(5)]
>>> list1
[0, 1, 4, 9, 16]

跟着小甲鱼学Python笔记(2)--->>列表

13.元组,戴上了枷锁的列表

列表:一个大仓库,你可以随时往里边添加和删除任何东西。 元组:封闭的列表,一旦定义,就不可改变(不能添加、删除或修改)

元组的创建

empty = ()                                           #定义了一个空元组
tuple1 = (1,7,4)                                   #定义了一个纯数字的元组
tuple2 = (2,'小甲鱼','醉酒青牛',5)        #定义了一个具有数字和字符串的混合元组

#然而,当元组中仅有一个元素时,需要将元素后面加上逗号,例如:
tuple3 = (1,)                    #定义了一个只包含数字1的元组,1后面必须加上逗号才表示元组
#甚至,不需要括号,仅仅有逗号就行,例如:
tuple4 = 1,

元组的访问

与列表一样

更新和删除元组

更新 -> 通过拼接实现

删除 ->通过del语句实现删除一个元组,但不能删除元组中的元素(但可以变通用拼接方法来删除)

14.字符串:各种奇葩的内置方法

字符串的分片操作

访问字符串中的字符

字符串的更新

字符串内置方法

字符串的方法及注释

Exercise

  1. 请写一个密码安全性检查的脚本代码:check.py

15.字符串的格式语句与操作符

字符串的格式化:format

1. 位置参数

2. 关键字参数

3. 位置参数与关键字参数一起用时

4. 打印花括号

5. 截断浮点数输出

相应的字符串格式化符号

字符串格式化符号含义及转义字符含义 %#再加格式化符号,可以显示进制类型

Exercise

  1. 编写一个进制转换程序,程序演示如下(提示,十进制转换二进制可以用 bin()这个 BIF):

16.序列相关内置函数介绍

列表、元组、字符串统称:序列

共同点:

  1. 都可以通过索引得到每一个元素

  2. 默认索引值总是从0开始(当然灵活的Python还支持负数索引)

  3. 可以通过分片的方法得到一个范围内的元素的集合

  4. 有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)

怎么把可迭代对象转换为列表、元组和字符串

list([iterable]) 把可迭代对象转换为列表 tuple([iterable]) 把可迭代对象转换为元祖 str(obj) 把对象转换为字符串

迭代

所谓迭代,是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。

枚举函数

enumerate()

打包函数

zip()

笔记:序列相关内置函数介绍

Exercise

  1. 猜想一下 min() 这个 BIF 的实现过程
  2. 视频中我们说 sum() 这个 BIF 有个缺陷,就是如果参数里有字符串类型的话就会报错,请写出一个新的实现过程,自动“无视”参数里的字符串并返回正确的计算结果

1-16讲阶段性总结

17.函数:Python的乐高积木

用函数的好处

函数的意义

函数是实现某一特定功能的一组代码的打包,它通过参数与外界交互(也可以不需要参数而执行某一特定功能)并返回处理后的结果(也可以只返回一个空)。在Python程序内,函数——>类对象——>模块是最基础和重要的部分,是入门必备的知识,没有之一!!!

函数的定义和调用

def functionname1():

​ 函数内容

函数的参数

def functionname2(参数名(可多个)):

​ 函数内容

函数的返回值

函数体内通过return返回一个变量的值

Exercise

  1. 编写一个函数 power()模拟内建函数 pow(),即 power(x, y)为计算并返回 x 的 y 次幂的值。
  2. 编写一个函数,利用欧几里得算法(脑补链接)求最大公约数,例如 gcd(x, y)返回值为参数 x 和参数 y 的最大公约数。
  3. 编写一个将十进制转换为二进制的函数,要求采用“除 2 取余”(脑补链接)的方式,结果与调用 bin()一样返回字符串形式。

18.函数:灵活即强大

形参和实参

函数的形参英文名为parameter,是在函数定义时的设置的参数,一般而言就是一个变量名,不需要赋初值,而是来接受在函数调用过程中传递过来的参数值;而实参是在函数调用时输入的参数,一般是一个确定的值,用来传递给形参。

文档的概念

在Python中将函数体内首行字符串作为函数文档,字符串中对函数的功能和参数的含义进行说明,可以通过使用函数名加成员操作符跟上__doc__的形式返回这个字符串以备使用者查看,也可以通过help(函数名)形式直接打印出这个字符串

关键字参数

当函数定义时形参比较多时,调用函数时时参要与形参一一对应,因为每一个参数的含义都不尽相同,怎样避免不把两者对应顺序弄乱呢,关键字参数的形式可以避免这一情况,在函数调用时直接将参数值赋值给对应的形参变量而不必顺序一一对应即可

默认参数

默认参数指的是函数定义时可以直接给形参变量赋初值,这样函数调用过程中即使没传入相应实参也能正常执行

收集参数

当函数参数数量不一定时,在函数定义时可以使用收集参数,即在形参变量名前加一个'*',其实表示该参数变量是一个元组类型,传入的实参会以元组形式赋值给形参变量

Exercise

  1. 编写一个符合以下要求的函数:

    a)计算打印所有参数的和乘以基数(base=3)的结果

    b)如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和运算

  2. 寻找水仙花数

题目要求:如果一个3位数字等于其各位数字的立方和,则称这个数为水仙花数,例如153=1^3+5^3+3^3,因此153是一个水仙花数。。编写一个程序,找出所有的水仙花数。

  1. 编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past,but you can improve your future. Once time is wasted, life is wasted." ,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现3次。”

19.函数:我的地盘听我的

函数和过程的区别

函数和过程都是指一段实现特定功能的代码段,如果该段代码有返回值则称为函数,否则称为过程。在Python中只有函数而没有过程,就算是函数体内没有return语句返回一个值,Python程序也会返回一个空的返回值

函数可以返回多个值

在Python中函数是可以返回多个值的,因为它有列表和元组这些数据类型

全局变量和局部变量

在Python中局部变量指的是在函数体内定义的变量,出了这个函数体程序就不认识它了,也就是其作用域仅限该函数体内部;而全局变量则是在函数体外定义的变量,它的作用域为整个代码段。这种作用域的差别从机理上讲是因为函数调用时其代码段和变量被临时存放到栈空间内,函数调用结束就收回该空间,所以函数体内定义的变量只在其函数体内有效。而全局变量则在整个程序代码段期间均有效,它只有在整个程序执行完成之后才会失效。所以在函数体内可以直接访问全局变量而不可以在函数体外访问局部变量(函数内定义的变量)

在任何程序语言中全局变量的修改都必须谨慎,Python也不例外,当在函数体内对对全局变量进行修改时,Python程序会自动生成一个与全局变量名一样的局部变量,从而达到对全局变量保护(在函数体内的操作不会改变全局变量值)的作用

Exercise

  1. 编写一个函数,判断传人的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读,例如:上海自来水来自海上

  2. 编写一个函数,分别统计出传入字符串参数(可能不止一个参数)的英文字母、空格、数字和其他字符的个数

20.函数:内嵌函数和闭包

如何在函数体内修改全局变量的值

在函数体内部无法直接修改全局变量的值,Python程序会自动将你在函数体内定义的变量生成为一个新的局部变量,仅是变量名和全局变量相同,由于作用域不同,你改变其值是无法影响到全局变量的值的,从而保护到了全局变量。但是如果你不想让这个变量被转换为一个新的局部变量,还是有办法的,就是先声明这个变量就是全局变量再修改它,其声明语句为global

内嵌函数

内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数。这个时候就牵涉到了函数体内部变量作用域的问题了,为了区分这两个函数,在这里我们将内嵌函数称为子函数,而将其外部的函数称为母函数。与全局变量和局部变量的关系一样:子函数体内定义的变量只在其函数体内部有效,但其内部却可以引用母函数体内定义的变量,但是却仍无法直接修改母函数体内定义的变量

闭包

闭包是一种满足特定要求的内嵌函数。这里我们还是将内嵌函数称为子函数,其外部的函数称为母函数,则当子函数体内有对母函数体内定义的变量的引用时我们称这个子函数为一个闭包。但当母函数和其闭包都定义了参数时,由于在母函数体外是无法直接对闭包进行函数调用的,为了能够实现对闭包的调用,需要在母函数内增加一条返回闭包函数名本身的语句,这个时候调用母函数后返回的是一个闭包的函数对象,就可以通过这种方法间接调用闭包函数了

在内嵌函数内修改外部函数内定义的变量的值

前面已经讲过,无法直接在闭包内部对外部函数的变量进行修改,但是如果真的非要修改的话,在Python3里面是可以的,需要增加一条声明此变量是外部函数内变量的语句nonlocal

21.函数:lambda表达式

lambda表达式 -> 匿名函数

两个重要BIF

1)filter(function or None,iterable):两个参数为函数和可迭代的序列,函数定义了过滤的规则,默认过滤出真的部分。 2)map(function or None,iterable):同filter()的两个参数相同,这个内置函数的作用是:将序列的每一个元素作为函数的参数进行运算加工,直到可迭代序列的每个元素都加工完毕,返回所有加工后的元素构成的新序列。

Exercise

  1. 请使用lambda表达式将下边函数转变为匿名函数?
  2. 请将下边的匿名函数转变为普通函数?
  3. 用filter()函数和lambda表达式快速求出100以内所有3的倍数?
  4. 还记得zip函数吗?

22.函数:递归是神马

1.递归的含义和一些用途 ​ 递归就是函数通过return语句实现自己调用自己的过程,基本上所有程序语言都有递归算法,他的重要性体现在‘一般程序员使用迭代,而天才程序员使用递归’这句话上,我们的的汉诺塔游戏的解法,树状数以及谢尔宾斯基三角形都用到了递归的思想。 2. 递归的深度和设定递归深度的函数 ​ 在Python3中针对递归提供了程序保护机制,默认允许的递归深度是100层,而如果我们需要使用网络爬虫等需要远远超过百次的递归层数时,就需要去修改程序默认的递归深度以满足要求。设置递归深度的函数为在sys模块里面的settrecursionlimit()函数进行设置。

23.递归:这帮小兔崽子

斐波那契数列

递归方法是一个双刃剑,用好了能解决很棘手的问题,例如汉诺塔游戏的解法实现,而用不好将会使得程序执行效率降低,例如上述实现斐波那契数列方法中,如果月数为35,则采用递归程序计算起来就慢多了,而迭代则瞬间计算完,虽然递归书写代码很简洁。

24.递归:汉诺塔

汉诺塔游戏的基本规则 ​ 汉诺塔游戏有三根柱子,分别为x,y,z。已知初始时在x柱子上有n个盘子,盘子大小各不相同,且大的在下,小的在上;要求将这n个盘子按同样顺序叠放到z柱子上,且要求每次只能转移一个盘子,且盘子在柱子上的顺序必须保证大的在下,小的在上。 递归算法实现汉诺塔游戏思路 ​ 递归算法的思想是“分制”方法,即将一个复杂问题分解为几个较复杂问题,再继续讲较复杂问题继续分解为次较复杂问题,继续将次较复杂问题往下分解直到分解为一个能直接解决的简单问题,然后再回过去。这里,我们用递归方法解决汉诺塔游戏的思路如下: ​ 将n个盘子从x柱子转移到z柱子问题分解为三个问题:1)将x柱子顶上的n-1个盘子转移到y柱子上;2)将x柱子最后一个盘子转移到z柱子上;3)将 ​ y柱子上的n-1个盘子转移到z柱子上。 ​ 依次将问题分解下去。。。。。。

虽然明白递归,但是,对汉诺塔这个,实在是还没搞懂~ :(

17-24讲阶段性总结

25.字典:当索引不好用时

字典是映射类型。字典的定义形式为:字典变量名 = {key1:value1,key2:value2....}。这里面key代表索引值,而value代表映射的值,通过大括号将其括起来进行字典的定义。访问字典时直接以字典变量名[key]进行访问

dict()函数的用法创建一个空字典,举例说明:

dict3 = dict()

通过将key和value作为一个序列类型(元组或列表)创建一个字典。举例说明:

dict4 = dict((('李宁','一切皆有可能'),('鱼C工作室','让编程改变世界')))

通过对关键字赋值创建一个字典,注意关键字必须是一个字符串类型且不能加引号,因为程序会默认为其加上一个引号,举例说明:

dict5 = dict(李宁='一切皆有可能', 鱼C工作室='让编程改变世界')

修改或添加字典元素

通过将变量赋值给字典访问类修改或者增加字典的元素,举例说明:

dict6 = {'李宁': '一切皆有可能', '鱼C工作室': '让编程改变世界'} dict6['李宁'] = '打造民族品牌'

当key值存在于字典内时,则重置key的value值

当key值不存在于字典内时,则字典增加一个相(key:value)

26.字典:当索引不好用时2

fromkeys(iterable, value=None, /)

创建并返回一个新的字典。其中第一个参数是一个可迭代对象(序列类型),第二个参数是value值,当第二个参数不提供时,则默认为none

访问字典的内置函数,这里主要是访问字典的key的keys(),访问字典的value的values(),访问item的items()。当然也可以直接用get()通过key访问其对应的value。

get(k[,d])

通过key返回对应的value值,第一个参数为key值,第二个参数为默认返回的value值,当key存在则返回对应的value,不存在字典内时返回该值,如果不提供则默认为none

清空字典和复制一个字典函数clear()和copy()。

这里面主要要搞清楚copy()和=赋值的区别,copy()相当于复制出一个新的字典,两者互不影响,而赋值=仅是将字典内存地址赋值出去,两者共同指向一个地址

去除字典一个元素内置函数 pop()、popitem()

pop(k[,d])当k存在字典的key时,在字典内去除该key对应的(key,value),否则返回d的值,当d不提供时返回错误

popitem()去除字典内的一个(key,value),如果字典本身为空时报错

setdefault()

给字典增加一个item,setdefault(k[,d]),返回k对应的value值,当k不在字典内时则返回d的值,如果d没提供则返回空;同时如果k不存在字典内时,将d作为value映射给k

update()

update([E, ]**F) -> None. Update D from dict/iterable E and F.将一个字典内的item作为item添加到字典内

27.集合:在我的世界里,你就是唯一

集合的概念和使用 ​ 在这里集合的概念和数学里集合的概念是一致的,都是一组元素的集,且元素之间不能重复。Python中集合的定义和字典类似,都需要大括号,区别在于集合不需要映射

set()函数 ​ 和序列工厂函数list(),str(),tuple()一样,可以将序列类型直接强制转换为一个集合类型

一个列表[1,2,3,4,5,5,3,1,0],如何去除列表内的重复元素,两种方法可供选择,第一种是常规方法,见下面所示:

list2 = [1,2,3,4,5,5,3,1,0] list3 = [] for each in list2:     if each not in list3:             list3.append(each) list3 2, 3, 4, 5, 0]     第二种方法使用集合的元素不重复性,通过将列表先强制转换为集合,再转换为列表形式实现,举例说明 list4 = [1,2,3,4,5,5,3,1,0] list4 = list(set(list4)) list4 [1, 2, 3, 4, 5]

add()

增加一个元素到集合内

remove()

从集合内删除一个元素

frozenset()

将一个集合冻结使之无法添加和删除元素的函数

28.文件:因为懂你,所以永恒

29.文件:一个任务

30.文件系统:介绍一个高大上的东西

模块的概念 ​ 模块就是实现特定功能的一类函数和变量的文件,后缀名是.py,它可以被其他程序所调用,调用语句是import。在Python程序中要是用模块的函数需要在前面加上模块名和成员操作符

os模块 ​ Python之所以称为跨平台的语言就是因为它具有os模块,使得同样的源代码可以在不同的操作系统上使用。

os.path模块是完成跟文件路径相关的函数模块

os、os.path 模块中关于文件、目录常用的函数使用方法

31.永久存储:腌制一缸美味的跑操

32.异常处理:你不可能总是对的

33.异常处理:你不可能总是对的2