读完 python 入门课程和后续课程后,觉得比较混乱,想整理一下自己的知识点。如果对你有帮助那再好不过。前面会给出代码,如果觉得看的懂可以直接跳过我给的解释,如果觉得有疑问,后面的我会给出详细的解释。
@python 是动态语言,你会发现定义一个变量可以任意,甚至随便赋值都可以。这和静态语言严格申明变量类型有所不同,下面是一些关于两种语言的摘要, 静态语言以 Java 为例。
静态类型有利于工具做静态分析,有利于性能优化,有利于代码可读性
有些人总是拿完成同样任务所用代码量来做比较,得出 python 优于 java 的结论,不得不说这是非常片面的观点。java 是有些啰嗦,不过 ide 能帮忙减少 80% 以上的键盘敲击,同时静态分析能帮忙解决 80% 以上的低级错误,代码提示能帮忙减少 80% 以上的查文档时间,至于强大的重构能力更是 python 望尘莫及的,所以只要是稍微大的项目,用 java 很可能比 python 开发速度更快。越是复杂的项目,使用静态语言可以利用编译器更早的发现和避免问题。这并不是说动态语言并不能用于大型项目,但是在超过一定规模之后,动态语言轻便灵活的优势就会被重构时的 overhead 给抵消掉。另一个原因是性能上的。同理,也不是动态语言写不出高效的代码,而是你花在优化上的时间会更多,而团队人多了水平难免参差不齐,不如静态语言稳妥。
那静态类型语言的优势究竟是什么呢?我认为就是执行效率非常高。所以但凡需要关注执行性能的地方就得用静态类型语言。其他方面似乎没有什么特别的优势。
@优雅,明确,简单。适合开发系统工具和脚本,网站。代码量最少,开发快,但运行较慢。不适合贴近硬件,游戏适合用 C 要用到渲染等技术,ios 和 Android 都有自己的语言。
@python2.7 版本和 3.X 版本不兼容,用的早的程序大多是 2.7,但是 2020 后,2.7 就不在用了,主要用于维护。所以现在开始学习的可以学 3.X。虽然上面那个课程是 2.7 版本的。
本书把大一点的 Python 脚本称为程序,简单的 Python 称为脚本。
@跨平台,几个系统下都能运行。
@Python 的优点是具有强大的模块功能。
@Python 解释器会将. py 文件编译为. pyc 字节码文件,再编译为. pyo 文件计算机可以识别。
@命名规则:
模块名,就是文件名,用小写加下划线的形式。lower_with_under
类名:Pascal 风格,CapWords
Functions: 小驼峰命名,myFirstName
@安装 python 很简单,到 官网下载 下一步安装,记住安装路径,一般不要安装到 C 盘,除非你的 C 盘很大。可以在 DOS 窗口里查看
出现这种错误需要修改环境变量,将你的 python 路径添加进去,
我的电脑–》属性–》高级系统设置–》环境变量–》系统变量 Path
记住前面加分号 ";" 不是冒号。安装的时候提醒过你记住你的安装位置了。
@在 Python 中,等号 = 是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。
@对缩进要求严格,首行不能有空格。
@理解变量在计算机内存中的表示也非常重要。当我们写:a = 'ABC'时,Python 解释器干了两件事情:
1. 在内存中创建了一个'ABC'的字符串;
2. 在内存中创建了一个名为 a 的变量,并把它指向'ABC'。
@用 PDB 调试
Import pdb
pdb.set_trace() #相当于运行断点,停在这里,然后可以用 p 变量名 ,查看变量。或者用命令 c 继续运行。IDE 最上面有基本调试工具。
- #@1
- A = [x for x in range(10)] #或者 A = list(range(10))
- A2 = [x*x for x in range(10)]
- B = list('abcdef')
- C = [x for x in range(1,100,2)]
- D = [x for x in A if x%2==0] #条件过滤表达式
- E = [i*100+j*10+k for i in range(1,10) for j in range(0,10) for k in range(1,10) if i==k]
- A[11] #报错,不能越界
- A[-1] #倒序访问,输出9
- A.append(11) #末尾加入数字11
- A.pop() #末尾删除9
- A.pop(-2) #删除第二个数字8
- A.clear() #清空列表
- A.insert(1,'99') #在第二个位置,插入99
- A[0],A[-1]=A[-1],A[0] #首尾数字交换
@1 初始时 A= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@1 初始时 B=['a', 'b', 'c', 'd', 'e', 'f']
@1 初始时 C=[从 1,到 100 的奇数]
@1 这种写法就是 Python 特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。
- #@2
- L[:5]
- L[0:5] #输出[0, 1, 2, 3, 4]
- L[-5:] #输出[5, 6, 7, 8, 9]
- L[1:5] #输出[1, 2, 3, 4]
- L[0:5:2] #输出[0, 2, 4]
- str1 = 'abcdefg'
- str[:3] #输出abc,操作通列表相同。
@2 列表的切片操作'开始元素':'最后元素':'取元素间隔'
@tuple 一旦创建完毕,就不能修改了, 创建 tuple 和创建 list 唯一不同之处是用 () 替代了[]。
- #@1
- T = tuple(range(10)) #两种方式一样
- T = tuple(x for x in range(0,10))
@1 输出 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
- #@2
- T1 = (a)
- T2 = (a,)
@2 正是因为用 () 定义单元素的 tuple 有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号",",这样就避免了歧义:
- #@1
- test = {'Alice':'21',
- 'Bob':'22',
- 'Clike':'23'}
- test.keys() #dict_keys(['Alice', 'Bob', 'Clike'])
- test.values() #dict_values(['21', '22', '23'])
- test['Bob'] #输出22,找不到报错
- test.get('Bob') #输出22,找不到返回空,不会报错。
- len(test) #输出3
- test.pop('Bob') #输出22,删除这个元素
- test.clear() #清空字典
- d1 = {'Daul': 75} #检查test是否有Daul,没有则加入
- if not 'Paul' in test:
- test.update(d1)
- for key in test: #遍历test
- print key,':',test[key]
@1dict 的第一个特点是查找速度快,无论 dict 有 10 个元素还是 10 万个元素,查找速度都一样。而 list 的查找速度随着元素增加而逐渐下降。
不过 dict 的查找速度快不是没有代价的,dict 的缺点是占用内存大,还会浪费很多内容,list 正好相反,占用内存小,但是查找速度慢。
由于 dict 是按 key 查找,所以,在一个 dict 中,key 不能重复。dict 的第二个特点就是存储的 key-value 序对是没有顺序的!这和 list 不一样
- #@2
- a = [1,'b','b',3,3,3,'d','d','d','d',5,5,5,5,5,'f','f','f','
- f','f','f',7,7,7,7,7,7,7,'h','h','h','h','h','h','h','h',9,9,9,9,9,9,9,9,9,'j','j','j','j','j','j','j','j','j','j',11,11,11,11,11,11,11,11,11,11,11]
- b = {} #定义空字典
- for d in set(a): #去重复的值,set
- b[a.count(d)] = d #去重后做计数,把数量和值写到字典b
- for e in reversed(sorted(b.keys())[-10:]):
- print e,':',b[e] #排序列表键值并取后10个(数量最大的10个),翻转后打印出数量与值。
- #遍历set
- s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
- for x in s:
- print x[0],':',x[1]
- s = set([1,2,3])
- s.add(4) #set添加元素
- s.remove(3) #删除3,不存在会报错
@2set 持有一系列元素,这一点和 list 很像,但是 set 的元素没有重复,而且是无序的,这点和 dict 的 key 很像。set 的内部结构和 dict 很像,唯一区别是不存储 value,因此,判断一个元素是否在 set 中速度很快。
set 存储的元素和 dict 的 key 类似,必须是不变对象,因此,任何可变对象是不能放入 set 中的。
- #@1
- 'hello python'.title() #输出 Hello Python
- 'HELLO PYTHON'.lower() #输出 hello python
- 'hello python'.upper() #输出 HELLO PYTHON
- '123456'.isdigit() #输出 True
- '12345 python'.isalnum()#输出 True
- 'abcdef'.isalpha() #输出 True
- 'abcdef'.find('abc') #输出 True
- 'hello python'.split() #输出['hello', 'python'],中间可以为任意空格
@str 可以切片,见 list
@isinstance(s,basestring) 判断一个变量 s 是不是字符串使用
@istitle(): 判定字符串是否每一个单词有且只有第一个字符是大写。
@ islower(): 是否全是小写,返回 bool
@isupper():是否全是大写,返回 bool
@title(): lower(),upper() 实现上述功能。
@isdigit(): 判断数字 ;
@alphanumeric: 数字字母混合 isalnum()
@isalphabetic: 按字母顺序的 isalpha()
@find:找不到返回 - 1 和 in:返回 bool 判断子串和主串
@切分 split()
- #@1
- str1 = '0xff00'
- print (eval(str1))
@1 输出为 65280。计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用 0x 前缀和 0-9,a-f 表示,例如:0xff00,0xa5b4c3d2,等等 eval(str)。将字符串作为表达式输出。
- #@2
- str1 = 'hello python'
- str2 = "hello python"
- print (str1 == str2)
@2 为真。字符串是以 "或"" 括起来的任意文本,本身不作任何区分。一样作用。
- #@3
- a = 5
- b = 6
- c = 4
- if a>b and print("这条语句不执行"):
- print(True)
- else:
- print(False)
@3 要解释上述结果,又涉及到 and 和 or 运算的一条重要法则:短路计算。在计算 a >b 时,如果是 False,则根据与运算法则,整个结果必定为 False,因此返回 False;如果是 True,则整个计算结果必定取决与 后面的运算,因此返回后面的值。
- #@1这是注释
- '''
- 这是文档注释
- 很长
- 很长
- '''
@1Python 的注释以 # 开头,后面的文字直到行尾都算注释
@1Python 中 raw 字符串与多行字符串,和注释很相似,都是'''
- #@2
- print('a','b','c') #a b c
@2print 会依次打印每个字符串,遇到逗号 "," 会输出一个空格,因此,输出的字符串是这样拼起来的:
- #@1
- for index,
- num in enumerate(L) : print(index, num)
@1 一个函数,可以输出索引和值
- isinstance(x, str)#判断x是不是字符串
来源: http://blog.csdn.net/qq_29611345/article/details/78759748