Python学习笔记
2016-05-03
近几日看了一本关于python基础的书—算法与程序设计基础 (python版),摘录其中的基础知识和比较好的编程方法,供大家学习,同时方便以后回忆。
1、基本语法
在python中基本类型有整型int、浮点float、布尔bool、字符串str,元组tuple()、列表list[ ]、集合set{ }、字典类型dict{ }等 。其中python还支持复数类型complex, real + imag(J/j后缀) 。
a = 3 float = 5.4 >>>type (True) >>><class ‘bool’> >>>aComplex = 4.23 + 8.5j >>> aComplex >>>(4.23000000000004 + 8.5j)
对浮点数据进行相等关系运算时,不能直接用等于==操作,浮点类型能够表示巨大的数,能够进行高精度的计算,但是由于浮点数在计算机内是用固定长度的二进制表示的,有些数可能没有办法进行精确的计算,计算会引起误差。
>>>2.1 – 2.0 >>>0.1000000000000009
这个例子中得到的结果比正常的略大,可以看出不能用==来判断是否相等,而是要检查两个浮点数的差值是否足够小,则认为是相等的。
数值对象运算表
运算符 |
描述 |
x+y, x-y |
加、减 |
x*y,x/y, x//y, x%y, x**y |
相乘,相除, 整除, 求余,求乘方 |
<, <=, >, >=, ==, != |
比较运算 |
or, and, not |
逻辑运算符 |
=,+=, -=, *=, /=, **= |
赋值,复合运算 |
另外,在python是允许级联比较的:
>>>a, b, c = 10, 20, 30
>>>a <=b <= c
>>>True
文本数据的操作
正则表达式在字符匹配、查找使用的比较多。
新建一个字符串变量直接s = “hello”,还可以切片及索引,直接用字符串*数字表示重复字符串(这个很好用(* ̄︶ ̄)y)
>>>”hi”* 3 >>>’hihihi ’ >>>”student”[5] >>>’n’ >>>s = “school” >>>s[1:4] >>>’cho’#切片,很实用啊
关于字符串的索引及切片:
h |
e |
l |
l |
o |
|
p |
y |
t |
h |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
批量数据表示与操作:元组tuple, 列表list, 集合set和字典dict
元组
>>>t1 = 1, 2, 3 >>>t2 = “sound ”, “easy ”, “western ”, “north ” >>>t3 = t1, t2 >>>t3 >>>((1, 2, 3), (‘sound ‘, ‘easy ‘, ‘western ‘, ‘north ‘)) >>>t4 = tuple(“python”) >>>t4 >>>(‘p’, ’y’, ’t’, ’h’, ’o’, ’n’)
列表
>>>L1 = list(“python”) >>>L1 >>>[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’ ] >>>L2 = list((“hello”, “well”, “python”)) >>>L2 >>>[‘hello’, ‘well’ , ‘python’]
元组和列表都可以通过下标索引元素
>>>L2[1][1]
>>>’e’
通常会用到list和字符串之间的转换,读取文件,分析输入的字符串等,split()函数可以将字符串转换为list数据类型,in语法在字符串查找和遍历中常用到,跟for循环一起使用。
集合和字典
集合具有去重功能,比较适合求交集并集等,可以很方便的比较两个集合的相同元素和不同元素, 有许多方法:union(), difference(), intersection(), add(), remove()等, 新建集合 s1 = {1, 55, 6, 90, 34}……
字典采用通过键值来查找信息, 键值和索引值之间反应了一种数据之间的关联,跟java里的map有点像,是一种映射数据类型,和set一样,无序存储,不能索引。字典的创建,d1 = {1: “Mon”, 2: “Tue”, 3: “Wed”,……},用构造器dict,monthdays = dict(Jan = 31, Feb = 28, ……)
>>>d1 = {(3,1):3, (3,2):6, (3,5):15, ……} >>>d1[(3, 1)] >>>3
2、控制结构
if 条件1:
条件1成立。。。
elif 条件2:
条件2成立。。。
else :
否则。。。
Python中没有switch语句,只能用if 。。。elif。。。elif。。。else。。。
for 迭代变量 in 字符串、序列或者迭代器:
循环体
else:
表达式
在循环中正常退出,会执行else块(但是好像不太常用)
其中,在for循环中经常用到range()函数,range(start, end, step = 1),其中的列表元素k,start <=k <end(在python中的索引都是如此,半开半闭)。
while 循环条件:
循环体
跟java中差不多,还有break, continue,pass语句,在判断和循环中也经常用到。
数据的输入和输出
在windows系统中文件目录使用反斜杠‘ \’,而在linux中‘ / ’,关于目录方面我也有一些问题没理清,需要继续学习。
终端输入输出,input(‘提示文本字符串’)和print(value,…,sep = ‘’, end = ‘\n’, file = sys.stdout, flush = False ),其中…表示可以输出多个对象,用‘, ’分隔,sep表示多个输出对象显示时的分隔符, 默认值为一个空格,end表示print语句的结束符号,默认值为换行符,也就是说print默认输出后换行。
插一个小曲:在练习时遇到了repr(),str()和eval()函数的问题,到网上搜了许多, python真神奇 щ(ʘ╻ʘ)щ 。
格式控制符号
格式符号 |
表示类型 |
格式符号 |
表示类型 |
%f%F |
浮点数 |
%o |
八进制整数 |
%d%i |
十进制整数 |
%x%X |
十六进制整数 |
%s |
字符串 |
%e%E |
科学技术 |
%u |
十进制整数 |
%% |
输出% |
输入输出重定向< , >
文件的操作:
open(file,mode = “r”, …)
f.read(size)返回一个字符串, f.readline()读取一行并返回字符串, f.readlines()返回一个列表,列表元素为每行字符串
数据写入时用write()函数,<文件对象>.write(string)
f.read()之后,文件指针达到文件末尾,如果再来一次,读取的将会是空内容,如果想再次都去,需要用到seek()函数,f.seek(offset, from_what), 具体的用法在实践中学习吧。
<文件对象>.close()
异常处理try: 。。。except: 。。。else:。。。, 手动抛出异常raise语句,继承Exception类
3、面向对象的构建程序
系统一般提供一些函数供用户直接调用,以增强系统的运算处理能力,方便用户使用,这些函数成为系统函数,系统函数又分为内建函数和标准函数库,内建函数是语言的一部分,可以直接使用,比如abs(),此外系统也可以导入外部函数。
定义函数;
def 函数名(参数表):
函数语句块
[return 返回值]
注意:
- 函数名应该是Python的合法标识符,函数名后紧跟的圆括号中是参数
- 参数可有可无,多个时用 “, ”分隔,默认值放在最后
- 定义函数后面需要跟“: ”,下行缩进
- 在函数中,通过return语句返回函数的值,也可不用return语句,这样,函数会返回None—python中的空值(相当于java中的NULL)
在程序中的函数可以多次调用,调用函数的形式为:函数名(实际参数表),在一个模块中,定义函数要在可执行程序之前,关于局部变量和全局变量,如果函数中定义的局部变量与全局变量同名,则局部变量屏蔽全局变量,通过global关键字可以在函数中调用全局变量,在python中不需要初始化就可以使用变量,这个我不太习惯,但是也有它的好处。
调用函数时所提供的实际参数仅仅是向函数提供值,函数内的改变并不会对原数值造成影响,但是列表除外,如果将列表对象作为函数的参数,则向函数中传递的是列表的引用地址。
一个文件就是一个模块,模块里可以有类、函数、变量等,类中也可以有,将多个文件放在一个文件夹下是一个包(只是自己的理解,不知道对不对)
从外部导入库使用import 包名.模块名, 访问函数时 包名.模块名.函数()
还有算法之类的就不多说了,数据结构、复杂度分析、查找排序问题等等,递归也是很重要的哦(* ̄︶ ̄)y
Python和java有很多思想上的相同点,以后继续探讨吧,今天就到这儿了,拜拜(⌒▽⌒)
4、总结
还有很多标准库,比如time、calendar等,需要继续学习,总体感觉python很方便、很强大,很轻松就可以实现一个功能,当然图形界面我还没有学到,相信会有很多惊喜。
由于是初学者,所以文中不免出现错误,请指正、见谅,文中的许多摘录都是这本书里的(不会侵犯知识产权之类吧。。。。。。),第一次写,不太好,相信以后会越来越好的,(⌒▽⌒)
计算机的知识真的是一门无底洞,作为一名门外汉,只能且学且珍惜了。。。。。。