参考:《零基础入门学习python》http://edu.csdn.net/course/detail/906?locationNum=1&fps=1&ref=srch&loc=2
论坛:http://bbs.fishc.com/forum-243-1.html
1、我和python的第一次亲密接触
python3 输出的方法:print() 括号中可以用双引号、单引号引用文本,也可以输出变量、输出公式等
同样的,input()的使用方法也一样
字符串可以直接用加号 + 连接,如输出print("well water "+"river"),就可以合在一起,输出well water river
字符串乘以一个数字n,可以输出n遍字符串
2、用python设计第一个游戏
python与C like语言(如C、C#、C++)等相比,不需要有变量声明,也没有大括号,但是要严格对齐,缩进量保持一致
只要打了冒号,下一行都要缩进
BIF = Built in function 内置函数
在shell中输入dir(__builtins__),就可以输出所有的BIF,(纯小写的函数)
用help(**)输入BIF的名字,就可以输出使用方法
3 小插曲之变量和字符串
变量的命名理论上可以取任何合法的名字,但作为一个优秀的程序员,请尽量给变量取一个专业一点的名字
创建字符串的时候,要在两边加上引号,可以是单引号,也可以是双引号,但必须配对
如果在字符串中需要出现单引号或双引号,可以使用转义符号(\)对字符串中的引号进行转义
我们可以使用反斜杠对自身进行转义,如str = "C:\\now",直接str会输出C:\\now,但如果是print(str),会输出C:\now
如果字符串中有多个反斜杠,则只需要在字符串前加一个r即可,可起到与上述相同的功能,自动在反斜杠前进行转义
在原始字符串的结尾是不能加反斜杠的,否则会报错
如果希望得到一个跨越多行的字符串,这就需要使用三重引号字符串(可以是单引号,也可以是双引号)
4 闲聊之python的数据类型
python的数值类型:整型、浮点型、布尔类型(True和False)
e记法(科学计数法,用来表示非常大的数和非常小的数,如1.5e11,表示1.5*10的11次方)
类型转换(字符串、整型、浮点型)
int()(注意浮点型转整型时会直接砍掉小数部分,而不是四舍五入)
float()、str()
获得关于类型的信息:
(1) type(),如a = '520' ,type(a),则会输出
(2)isinstance(),如a = '小甲鱼', isinstance(a,str)则会返回True,意思是会判断函数中第一个参数类型是否是第二个参数的类型,如果是则返回True,否则返回False
5 Python之常用操作符
算术操作符:+ - * / % ** //
注意://表示地板除法,即整数除以整数,得到的还是整数,如果是单斜杠,在python3中会得到真实小数值
**是幂运算操作符,如3**2表示3的2次方
比较操作符:> < >= <= == != 返回True或False
逻辑操作符:and、or、not 结果输出True False
优先级问题:幂运算>正负号>算术操作符>比较操作符>逻辑运算符
6 了不起的分支和循环01
7 了不起的分支和循环02
python可以有效避免“悬挂else”,即else和if没有正确匹配,因为python是使用缩进来进行对齐匹配
条件表达式(三元操作符):有了三元操作符的条件表达式,可以使用一条语句来完成条件判断和赋值操作,如small = x if x< y else y
断言(assert):当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常,便于调试找到问题所在,如assert 3 >4,会返回AssertionError,一般来说我们可以用它在程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了。
8 了不起的分支和循环03
for循环语法:
for 目标 in 表达式:
循环体
range()语法(常与for搭配使用):
range([start,] stop[,step=1])
这个BIF有三个参数,其中用中括号括起来的两个表示这两个参数是可选的
step=1表示第三个参数的值默认是1,表示步进数
range这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列,注意不包含stop数
break:跳出当前循环
continue:终止本轮循环,并开始下一轮循环
9 列表:一个打了激素的数组01
列表可以把python中的一切东西打包,如整数、浮点数、字符串、对象,比数组更强大
向列表中添加元素:
append(),如member = [1,2,3,4,5],member.append(6),则member输出[1,2,3,4,5,6],但是append()只能一个一个加,不能同时添加两个元素,这时候要用到extend方法
extend():是用一个列表来扩展另一个列表,如member.extend([7,8]),则输出[1,2,3,4,5,6,7,8]
insert():有两个参数,第一个参数表示插入的位置,第二个参数表示插入的元素,如member.insert(1,0),则输出[1,0,2,3,4,5,6,7,8],注意序数都是从0数起
10 列表:一个打了激素的数组02
从列表中获取元素:跟数组一样,可以通过元素的索引值(index)从列表中获取单个元素,注意,列表索引值是从0开始的
从列表中删除元素:
remove():直接删除元素,不需要知道在哪个位置,如member.remove(0),则输出[1,2,3,4,5,6,7,8]
del 不是一个函数,也不是方法,所以不用加括号, 如del member·[0],则输出[2,3,4,5,6,7,8]
pop():从列表中取出最后一个元素删除并返回,如member.pop(),则返回8,member就变为[2,3,4,5,6,7]
列表分片(slice):利用索引值,每次可以从列表中获取一个元素,但是如果要一次性获取多个元素,则需要列表分片。如member[1:3],则输出[3,4],但原列表并没有变化,还是[2,3,4,5,6,7]
11 列表:一个打了激素的数组03
列表常用操作符:比较操作符、逻辑操作符、重复操作符(*)、赋值操作符、成员关系操作符
列表的比较是从第0个元素开始比较,能判断出大小就不会继续判断后边的元素
如果要访问列表中的列表中的元素,则采用类似于二维数组的方法,如list[1][1],则表示输出列表list中第2个元素(列表)中的第二个元素
列表中的其他小伙伴:
如member = [1,1,2,3,4,5,6]
member.cout(1) 输出为2 ,表示1的个数
member.index(2) 输出为2,表示2的索引值为2
member.reverse() 表示将列表翻转,前后顺序改变,则输出[6,5,4,3,2,1,1]
member.sort()表示将列表中元素从小到大排序,则输出[1,1,2,3,4,5,6]
注意拷贝的区别:必须得用上一节的分片拷贝方法,如list1 = list[:],而不能直接list1 = list[],虽然表面上结果一样,但实际上直接=时,只是添加了一个指向,当原list发生变化时,直接=的list也会发生变化。但是如果用分片的方法拷贝,则会重新加一个列表,而不是简单的指向,原列表发生变化时,复制后的列表不会发生相应改变。因此,为了避免出现bug,复制时一定要用分片的方法,加上冒号
12 元祖(tuple):戴上了枷锁的列表
由于元祖和列表是近亲关系,所以在实际使用上是非常相似的。最大区别是列表可以随便更改元素,但元祖不可改变。
创建元祖的方法:大部分情况下是使用小括号(列表是中括号),如tuple1 = (1,2,3,4,5,6)
访问的方法和元祖类似,tuple[1],则返回2,其它的访问方法类似
注意元祖的关键标志不是小括号,而是逗号,如temp = (1),则temp的类型是int,如果temp = 1,2 则temp的类型就是元祖,即使只有一个元素,后边也得加上逗号,括号不是最必要的
13 字符串:各种奇葩的内置方法
http://bbs.fishc.com/forum.php?mod=viewthread&tid=38992&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
14 字符串:格式化
格式化的目的相当于翻译,将数据以要求的格式输出,如转化成十进制、十六进制等等
http://bbs.fishc.com/forum.php?mod=viewthread&tid=92997&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
format方法
"{0} love {1}.{2}".format("I","FishC","com"),则输出 I love FishC.com
"{a} love {b}.{c}".format(a="I",b="FishC",c="com"),则输出 I love FishC.com
"{a} love {b}.{0}".format(a="I",b="FishC","com"),则输出 I love FishC.com
15 序列!序列!
列表、元祖、字符串的共同点:
list()可以把字符串、元祖等变成列表
tuple()把一个可迭代对象转化成元祖
str()把对象转化成字符串
len(sub)返回参数sub的长度,sub可以是列表、元祖、字符串
max()返回参数中的最大值(但要求序列中元素的类型保持一致)
min()返回参数中的最小值(但要求序列中元素的类型保持一致)
sum()返回序列中元素的和(不能对字符串操作,但要求序列中元素的类型保持一致)
sorted()将序列从小到大排序
reversed()将序列元素倒转)(返回对象,list一下可以显示)
enumerate()将列表中的元素变成元祖,并且每个元素前加上索引值(返回对象,list一下可以显示)
zip()将两个序列中的对应元素合并起来,多余的就删掉(返回对象,list一下可以显示)
16 函数:Pyhon的乐高积木
定义一个函数:def func():
print("这是一个函数")
17 函数:灵活即强大
函数文档:定义函数的时候,最好有备注说明,方便维护,调用函数文档的方法(1)func.__doc__ (2)help(func)
关键字参数:调用函数时,可以用给形参赋值的方法,来避免参数顺序乱了后造成的结果不一致
默认值参数:在函数定义的时候,给形参默认赋值,这样调用函数的时候即使没有赋值,也会有结果输出,但如果调用时重新赋值,会按照实际赋值输出结果
收集参数(可变参数):在形参前加上*号,这样即使定义一个,实际调用时,可以用多个实参,只需要用逗号隔开就好,原理是python默认将所有的参数打包成一个元祖处理
18 函数:我的地盘听我的
python所有的函数都会有返回的,默认会返回none,所以即使没有return,也可以用赋值语句调用函数
python可以用列表的形式返回多个值,如果不加括号,会返回元祖
如果在函数中试图修改全局变量,python会在函数中新建一个名字一样的局部变量,不会影响到全局变量的值,即函数可以访问全局变量,但不能修改全局变量(下一节提供修改方法)
19 函数:内嵌函数和闭包
如果想要在函数中修改全局变量,需要在函数中添加global声明,即在变量前添加global,即可在函数中修改全局变量
函数可以嵌套定义,即在函数中继续定义函数,但是内嵌的函数作用域只存在于外围函数,而在其它地方无法调用
nonlocal和global的作用类似,可以用来调用修改函数外围的变量
20 函数:lambda表达式
lambda x : 2 *x+1 表示定义了变量为x的2x+1的函数,而不需要定义函数名字
lambda函数的作用:
filter():过滤器 如果第一个参数为None,则会去掉第二个参数非True的内容;第一个参数也可以输入有值的表达式,也可以过滤特定的需要的数据
map():映射 会将第二个参数序列中的值依次放到第一个参数中的表达式,来输出结果
21 函数:递归是神马
函数调用自身的行为就是递归,并且要有正确的返回条件,否则会陷入死循环
22 递归:这帮坑爹的小兔崽子
递归比较简单,但某些情况下实现效率比迭代低
23 递归:汉诺塔
24 字典:当索引不好用时01
字典是python中的映射类型,区别于之前提到的序列类型(列表、元祖、字符串)
字典用大括号{}创建表示,注意字典不是序列类型
字典有两个关键元素,分别是key(键)和value(值),如dict = { ' 李宁 ' : ' 一切皆有可能 ' , ' 耐克 ' : ' Just Do It ' }
访问方法 print('李宁的口号是:' , dict['李宁'])
25 字典:当索引不好用时02
fromkeys():创建并返回新的字典,有两个参数,第一个参数是key,第二个参数是value,默认为空;注意后边的value是给每个key赋值,而不是依次赋值
访问字典的方法:
keys():返回字典的键值
values():返回字典的键对应的值
items():返回字典的每一项,用元祖的形式打印,包括键和值
注意如果要清空字典,要用clear()的方法
copy()浅拷贝,注意区分赋值与浅拷贝的区别,赋值地址没变,只是给原数据重新贴了标签,当原数据变化时,赋值的也会变化,copy则有不同的地址,原数据变化后不会有变化
popitem():随机弹出一组键和值,因为字典中没有顺序
update():用另一个字典更新字典中的value