python 学习笔记
1. 没有 switch 语句,只能用 if 和 elif 来实现。
2. while … else 语句
3. 循环数组的例子:
# -*- coding: UTF-8 -*- fruits = ['banana', 'apple', 'mango'] for index in range(len(fruits)): print '当前水果 :', fruits[index] print "Good bye!"
range返回一个序列的数。
如果不需要判断索引值,可以用下面的方法:
member = ['song','cui','ting'] for each in member: print(each,len(member))
注意,each直接是值了,如果是 dict,each 就是键值
4. for … else 语句
5. pass 不做任何事情,一般用做占位语句。
6. dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。(很实用的调试函数)
7. python 也有 math ,但使用前需要先引入
import math
8. 常用的随机函数:
random(),shuffle(lst)
9. 三引号允许一个字符串跨多行。PHP的是 <<<EOF EOF;
hi = '''hi there'''
10. 常用的字符串函数
string.isnumeric() string.replace(str1, str2, num=string.count(str1)) string.find(str, beg=0, end=len(string)) - PHP是 strpos string.strip([obj]) - PHP 是 trim string.lower() - PHP 是 strtolower string.upper() - PHP 是 strtoupper
11. 列表(List),相当于数组;元组相当于只读的数组
12. 字典,相当于 JSON 对象。
>>>dict = {'a': 1, 'b': 2, 'b': '3'}
>>> dict['b']
这样获取字典中的元素,而不是 dict.b
a. 判断 key 是否存在用 in
b. 删除 key : del dict['x']
循环数据
for
注意区分字典和集合。其实集合和 list 类似,而不是和字典类似,但是集合中的元素是无序的,且会自动除去重复元素。
13. 日期和时间
import time time.time() - 时间戳 time.localtime(time.time()) - 详细的时间 time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) - 格式化时间
14. 日历(Calendar),需要用到再详细了解
15.可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
16.缺省参数,跟其它语言没什么区别。
17.不定长参数。PHP是后期的版本才有这个的。
def functionname([formal_args,] *var_args_tuple )
18.匿名函数,很简单,只能一行。lambda [arg1 [,arg2,.....argn]]:expression
19.变量作用域:跟 Javascript 差不多吧
20.import 入引模块。
from import : 从车里把矿泉水拿出来,给我 import : 把车给我
21.包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
22.文件操作
fo = open("foo.txt", "w") print "文件名: ", fo.name print "是否已关闭 : ", fo.closed print "访问模式 : ", fo.mode print "末尾是否强制加空格 : ", fo.softspace
23.面向对象
类的构造函数:__init__
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。
析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
24.正则表达式
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
正则替换:
xml = re.sub(r"<vcpu placement='static'>(\d+?)</vcpu>", "<vcpu placement='static' current='\g<1>'>\g<1></vcpu>", xml)
参考:https://www.crifan.com/python_re_sub_detailed_introduction/
25.global 跟 PHP 的是一样的。
26.函数可以返回多个值,这个比 PHP 方便多了。 例如下:
import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny x, y = move(100, 100, 60, math.pi / 6)
27. 可变参数
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
28. 在 window 下,用 pyinstaller -F Tkint.py 生成 exe,再在组策略里设置这个 exe 运行。
在 linux 下,用 python -m py_compile file.py 生成 pyc,这样只要是保护自己的代码。
29. sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始。
30. 在Python中,要想引发异常,最简单的形式就是输入关键字 raise ,后跟要引发的异常的名称。
raise Exception("Invalid level!", level)
31. Python函数的定义必须在调用前面(函数调用函数例外),这和其它语言不一样
32. Python中布尔值使用常量True和False来表示
33. 如果在函数内部引用全局变量,像 PHP 一样,加上 global 或 n....
34. 数字拼接字符串:'%s%d'%('/dev/sda',2)
35. 异常例子:
try: info = vol.info() total_size = info[1] + capacity print('total_size', total_size) resize_result = vol.resize(total_size) print('resize_result', resize_result) return True except (libvirt.libvirtError, TypeError), e: print(e.message) return False try: 1/0 except Exception, e: trace = traceback.format_exc()
36. bytes
如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
'中文'.encode('gb2312')
# bytes object b = b"example" # str object s = "example" # str to bytes bytes(s, encoding = "utf8") # bytes to str str(b, encoding = "utf-8") # an alternative method # str to bytes str.encode(s) # bytes to str bytes.decode(b)
37. 格式化字符串
url = '%s%s'%("http://xxx.xxx.xxx/xxx/sendsms?token=", token) 用%%来表示一个% 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125) #'Hello, 小明, 成绩提升了 17.1%'
38. 常量
PI = 3.14159265359
Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法
39. classmates[-1] - 获取最后一个元素
classmates.append('Adam') - 对应的 $arr[] = ''; arr.push(); classmates.insert(1, 'Jack') - 把元素插入到指定的位置 classmates.pop() - 要删除list末尾的元素 classmates.pop(1) - 要删除指定位置的元素,用pop(i)方法,其中i是索引位置
40. tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
暂时还没有用到这种写法,所以暂时跳过。
41. int(s) - 和PHP是一样的用法
42. dict 也就是对象,根据健值获取 value
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} d['Michael'] 'Thomas' in d - 判断健值是否存在 (PHP 是 in_array,JS 也是 in) d.get('Thomas', -1) - 同上是一样的 d.pop('Bob') - 删除 key (PHP是unset($arr['x']))
43. set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
暂时觉得没什么用?
44. 一则例子:
>>> a = 'abc' >>> a.replace('a', 'A') 'Abc' >>> a 'abc'
因为 str是不变对象,所以输出还是原来的字符串。正确写法是:
>>> a = 'abc' >>> b = a.replace('a', 'A') >>> b 'Abc' >>> a 'abc'
45. 关键字参数:def person(name, age, **kw)
>>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
这个表示比较难理解,暂时跳过。
46. 切片
>>> L[0:3] ['Michael', 'Sarah', 'Tracy'] 字符串'xxx'也可以看成是一种list
47. 判断对象是否可以迭代?
isinstance('abc', Iterable)
48. enumerate函数可以把一个list变成索引-元素对
>>> for i, value in enumerate(['A', 'B', 'C']): ... print(i, value) ... 0 A 1 B 2 C
49. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回.
50. reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
51. python 也有闭包也有匿名函数。
52. 装饰器.这是PHP没有直接有的概念,要好好理解才行。
53. 偏函数也是PHP没有的概念。
54. isinstance(b, Animal) 判断变量是否是某个类型。
55. classmethod(类方法) 或是一个 staticmethod(静态方法),这取决于我们是否需要知道这一方法属于哪个类。由于我们已经引用了一个类变量,因此我们使用 classmethod(类方法)。
class A(object): bar = 1 def foo(self): print 'foo' @staticmethod def static_foo(): print 'static_foo' print A.bar @classmethod def class_foo(cls): print 'class_foo' print cls.bar cls().foo() A.static_foo() A.class_foo()
56. 基本类型都可以用type()判断。
57. 使用@property
好像没多大的作用?
受保护的函数
58. Python 有多重继承。
59. 获取路径的例子:
path = '{0}/xmls/{1}.xml'.format(os.getcwd(), 'test')
60. u'哈' -- u表示将后面跟的字符串以unicode格式存储
61. t = (1,) -- Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
62. 判断字典是否不存在某个 Key : if 'name' not in data
63. False,0,'',[],{},()都可以视为假
上面在虚拟机好像不对,if kw!={} 结果正常
64. 三元运算:
if __name__ == '__main__': a = '' b = 'True' c = 'False' #方法一:为真时的结果 if 判定条件 else 为假时的结果 d = b if a else c print('方法一输出结果:' + d) #方法二:判定条件 and 为真时的结果 or 为假时的结果 d = a and b or c print('方法二输出结果:' + d) #以上两种方法方法等同于if ... else ... if a: d = b else: d = c print('if语句的输出结果:' + d)
65. 不同系统的差异
Linux: time.strftime('%Y-%m-%d %H:%i:%s',ts) Window: time.strftime('%Y-%m-%d %H:%M:%S',ts)
66. py文件生成exe可执行程序
pyinstaller -F test.py
67. 字符串分割
str.split(str="", num=string.count(str)).
68. 有序字典:
od = OrderedDict([('a', 1), ('c', 2), ('b', 3)])
69. json.loads 和 json.dumps
70. Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
举一个简单的例子,在寻找一个字符串中所有的英文字符:
import re pattern = re.compile('[a-zA-Z]') result = pattern.findall('as3SiOPdj#@23awe') print result # ['a', 's', 'S', 'i', 'O', 'P', 'd', 'j', 'a', 'w', 'e']
71. 正则查找
match = re.search(r"root:(.+?):(\d+?):(\d+?):(\d+?):(\d+?):::", str) print(match.group(0,1,2,3,4,5))
72. 正则替换
match = re.match(r"^root:(.+?):(\d+?):(\d+?):(\d+?):(\d+?):::(.+?)$", shadow, re.S) m = match.group(1,2,3,4,5,6) shadow = 'root:{}:{}:{}:{}:{}:::{}'.format(cryptPassword, m[1], m[2], m[3], m[4], m[5]) return shadow
73. '-'.join(arr)
74. 历遍字典类型
#!/usr/bin/python
dict={"a":"apple","b":"banana","o":"orange"}
for i in dict:
print "dict[%s]=" % i,dict[i]
for (k,v) in dict.items():
print "dict[%s]=" % k,v
75. 字符串可以通过索引的方式访问
>>> a = 'abcdefg'
>>> print(a[2])
76. 字典赋值,实现是指向同一个对象
[root@localhost Log]# python3
>>> o = {'a':1, 'b':2}
>>> oo = o
>>> oo['a'] = 3
>>> print(o,oo)
{'a': 3, 'b': 2} {'a': 3, 'b': 2}
这个时候,要用对象复制的方式
#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict1 = {'user':'runoob','num':[1,2,3]}
dict2 = dict1 # 浅拷贝: 引用对象
dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1)
# 输出结果
print(dict1) #{'num': [2, 3], 'user': 'root'}
print(dict2) #{'num': [2, 3], 'user': 'root'}
print(dict3) #{'num': [2, 3], 'user': 'runoob'}
Python中通过copy模块有两种复制(深复制与浅复制)
copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象。
deepcopy 深复制 复制对象及其子对象
77. 继承
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
pass
class Cat(Animal):
pass
78. splitlines 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
79. Python 是区分大小写的