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 是区分大小写的

posted @ 2018-05-11 09:47  chy1000  阅读(158)  评论(0编辑  收藏  举报