python

Python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。
它简洁、简单、方便、容易扩展,有许多自带的数据结构,而且它开源。
一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译成机器码再执行。
Python是一种区分大小写的语言。

数组和元组

数组内容是可以被修改的,而元组内容是只读的。另外,元组可以被哈希,比如作为字典的关键字。

数组和列表

数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。

数据结构

Python自带的数据结构分为可变的和不可变的。可变的有:数组、集合、字典;不可变的有:字符串、元组、数。

Python自省

自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型。简单一句话就是运行时能够获得对象的类型。比如:type()、dir()、getattr()、hasattr()、isinstance()
image.png

python模块

Python模块是包含Python代码的.py文件。此代码可以是函数类(定义函数def)或变量。一些常用的内置模块包括:sys、math、random、data time、JSON。

  • os模板提供了一种方便的使用操作系统函数的方法
  • sys模板可供访问由解释器使用或维护的变量和与解释器交互的函数

image.png
image.png
image.png

命名空间

命名空间是一个命名系统,用于确保名称是唯一性,以避免命名冲突。

PYTHONPATH

导入模块时使用的环境变量。每当导入模块时,也会查找PYTHONPATH以检查各个目录中是否存在导入的模块。解释器使用它来确定要加载的模块。

pickling和unpickling

Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。

单下划线和双下划线

  • name:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突
  • _name:一种约定,用来指定变量私有
  • name:解释器用_classnamename来代替这个名字用以区别和其他类相同的命名

    单引号,双引号,三引号

    单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释
    如果要表示Let’s go 这个字符串
    单引号:s4 = ‘Let\’s go’
    双引号:s5 = “Let’s go”
    s6 = ‘I realy like“python”!’

    newinit和self

  • init为初始化方法,new_方法是真正的构造函数。

  • new_是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法
  • init是实例创建之后被调用的,然后设置对象属性的一些初始值。

init是Python中的方法或者结构。在创建类的新对象/实例时,将自动调用此方法来分配内存。所有类都有init_方法。
image.png
self是类的实例或对象。在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。

区分break,continue和pass

pass语句不会执行任何操作,一般作为占位符或者创建占位程序

args,*kwargs

当函数的参数前面有一个星号号的时候表示这是一个可变的位置参数,两个星号**表示这个是一个可变的关键词参数。星号把序列或者集合解包(unpack)成位置参数,两个星号**把字典解包成关键词参数。
image.png

管理内存

python中的内存管理由Python私有堆空间管理。所有Python对象和数据结构都位于私有堆中。程序员无权访问此私有堆。python解释器负责处理这个问题。
Python对象的堆空间分配由Python的内存管理器完成。核心API提供了一些程序员编写代码的工具。
Python还有一个内置的垃圾收集器,它可以回收所有未使用的内存,并使其可用于堆空间。

类型转换

image.png

Python的装饰器

装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。

拷贝一个对象

Python中对象之间的赋值是按引用传递的,如果要拷贝对象需要使用标准模板中的copy

  • copy.copy:浅拷贝,只拷贝父对象,不拷贝父对象的子对象。
  • copy.deepcopy:深拷贝,拷贝父对象和子对象。


image.png

常见函数

排序

  1. a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
  2. a.sort()
  3. last=a[-1]
  4. for i inrange(len(a)-2,-1,-1):
  5. if last==a[i]:
  6. del a[i]
  7. else:last=a[i]
  8. print(a)

删除一个list里面的重复元素

使用set函数,set(list)
使用字典函数

  1. a=[1,2,4,2,4,5,6,5,7,8,9,0]
  2. b={}
  3. b=b.fromkeys(a)
  4. c=list(b.keys())
  5. c

查询和替换一个文本字符串

使用re模块中的sub()函数或者subn()函数来进行查询和替换
sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量

如何生成随机数

random模块
随机整数:random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。
随机实数:random.random( ):返回0到1之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数。

列表的交集与差集

  1. b1=[1,2,3]
  2. b2=[2,3,4]
  3. b3 = [val for val in b1if val in b2]
  4. print b3
  5. b1=[1,2,3]
  6. b2=[2,3,4]
  7. b3 = [val for val in b1 if val not in b2]
  8. print b3

range()函数

列出一组数据,经常用在for in range()循环中

发送邮件

使用smtplib标准库

  1. import sys, smtplib
  2. fromaddr =raw_input(“From: “)
  3. toaddrs = raw_input(“To: “).split(‘,’)
  4. print Enter message, end with ^D:”
  5. msg =
  6. while 1:
  7. line = sys.stdin.readline()
  8. if not line:
  9. break
  10. msg = msg + line
  11. # 发送邮件部分
  12. server = smtplib.SMTP(‘localhost’)
  13. server.sendmail(fromaddr, toaddrs, msg)
  14. server.quit()

except的用法和作用

try…except…except…[else…][finally…]
执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。

match()和search()

re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。

  1. print(re.match(‘super’, superstition’).span()) #(0, 5)
  2. print(re.match(‘super’, insuperable’)) #None
  3. print(re.search(‘super’, superstition’).span()) #(0, 5)
  4. print(re.search(‘super’, insuperable’).span()) #(2, 7)

实现单例模式

  1. class Singleton(type):
  2. def __init__(cls, name, bases, dict):
  3. super(Singleton, cls).__init__(name, bases, dict)
  4. cls.instance = None
  5. def __call__(cls, *args,**kw):
  6. if cls.instance is None:
  7. cls.instance = super(Singleton, cls).__call__(*args, **kw)
  8. return cls.instance
  9. class MyClass(object):
  10. __metaclass__ = Singleton
  11. print MyClass()
  12. print MyClass()
  1. def singleton(cls):
  2. instances = {}
  3. def getinstance():
  4. if cls not in instances:
  5. instances[cls] = cls()
  6. return instances[cls]
  7. return getinstance
  8. @singleton
  9. class MyClass:

socket编程

文件操作

如何用Python删除一个文件?
使用os.remove(filename)或者os.unlink(filename);
Python如何copy一个文件?
shutil模块有一个copyfile函数可以实现文件拷贝

GIL

Python的垃圾回收机制

Python中的垃圾回收是以引用计数为主,标记-清除分代收集为辅。

  • 引用计数:Python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。
  • 标记-清除:一些容器对象,比如list、dict、tuple,instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。
  • 分代收集:Python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。