python学习笔记

python===### 地址1. mac 下python 2.7的地址 /Library/Python/2.7/3.6/Library/Frameworks/Python.framework/Versions/3.6/- 避免循环导入依赖的方法 依赖放在最后面------# 正则表达式+表示至少一个字符{n}表示n个字符 *表示任意个字符?表示0个或一个字符.可以匹配任何字符\w匹配字母\d匹配数字\s匹配一个空格r代表正则表达式^表示行的开头,$表示行的结束\d$必须以数字结束\w$必须以字母结束多加一个\代表转义字符'ABC\\-001'匹配:abc\001\d{3} 可以匹配:010, 230,123\s+ 表示至少一个空格\s{4}表示至少4个空格\d{3,8} 表示3到8个数字\d{3}\s+\d{3,8}\d{3} 三个数字,\s匹配一个空格 \d{3-8}3-8个数字## 进阶 [0-9a-zA-Z\_] 匹配一个数字,一个字母,或者下划线[0-9a-zA-Z\_]+ 匹配至少由一个数字字母或者下划线组成的字符串[a-zA-Z\_][0-9a-zA-Z\_]匹配由字母或者下划线开头,后接任意个由一个数字,字母,下划线组成的字符串### 方法- match 表示是否匹配,如果匹配 返回match对象,否则返回None- split() 方法用于切割 'ab c'.split(' ')- ###### finditer : 返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。 ### 提取子字符串sd=re.match(r'^(\d{3})-(\d{6})','021-2345678')### 输出第几组函数print(sd.group(1))输出第一组函数### 替换字符串re.subpath = re.sub('[_]', '/', url1)将_全部替换为/### |是或的意思,匹配到两个的任何一个都行sd=re.compile('| {7}')## 预编译正则表达式每次使用都要编译所以先预编译一下### 两个字符串 或匹配sd=re.compile('/places/default/(index|view)/.*?[\d]$')#### 正则Demo```find_id = re.compile('\w{0,5}-\w{0,5}-\w{0,7}-\d{0,3}')str='fan-jia-liang-57'```## numpy函数: 1.shape函数:计算数组大小 2.mat函数 将目标数据转换为矩阵 3.zero 函数 将数组初始化为0 4.numpy.array将list转换为numpy的数组 5.random ranint 取随机数 6.去掉字符串最后的换行符:line=line[:-1] 7.numpy比较两个array是否全部相同, if(arry1==array2).all() print(true)### python读取文件的三种方法:- f = open("foo.txt") # 返回一个文件对象 line = f. adline() # 调用文件的 readline()方法 while line: print line, # 后面跟 ',' 将忽略换行符 #####print(line, end = '')   # 在 Python 3中使用 line = f.readline() f.close()- for line in open("foo.txt"): print line,- f = open("c:\\1.txt","r") lines = f.readlines()#读取全部内容 for line in lines print line python 往txt写内容: with open('a.txt','w') as f: for i in a: f.write(i) ### python 字符乱码问题 ### 字符串编码encoding 将str转换为机器码decoding 将机器码转换为str#### plt 乱码- 在/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages下- 在py中加 plt.rcParams['font.sans-serif']=['SimHei']将simhei字体下载放在pyplot中即可解决乱码#### requests乱码# list- list.index()求元素的下标- str list和 int list 互相转换 nums=[int (i) for i in nums]- s = re.findall("\d+",nums)找出字符串中所有数字- list1 = ["这", "是", "一个", "测试"] for index, content in enumerate(list1): print (index) print (content)- 元组转List tuple =list(tuple)- list 去除重复元素 list=set(list)- 查找元素 a.index(s) 查找s元素的下标位置- 逆序输出list reversed(a)- list的复制 ``` import copy a=[123,234,677] b=a[:] print(b) c=copy.deepcopy(a) print(c) ```### tuple1. 对于不可变类型,不管是深拷贝还是浅拷贝,都只是创建一个引用2. 元组为不可变类型3. 对于str类型,如果两个str相同,那么是is和=的,这是python的优化方法,善意的谎言。。。4. 在小的整数上也会采取这种措施 停留interning5. ### dict#### 散列方法获得dict[key]的值,首先调用hash(key)来计算key的散列值,把这个值的低几位数字作为偏移量,在散列表中查找表元,如果表元是空的,就抛出异常。 如果不为空,则检查key是否等于found_key如果相等则返回结果。如果不相等,发生散列冲突,发生的原因:在寻找元素值时,如果发生了冲突,算法会在散列值中另外取几位。然后将新得到的数字当做索引来寻找表元。 如果找到的为空,抛出keyerror,如果冲突,重复刚才步骤#### 带来的后果##### dict 的key值必须是可散列的, 也就是说是固定不变的,str,bytes 还有数字类型##### 消耗的空间比较大##### 键值的查询很快键值的次序取决于添加顺序对于不存在的dict 会抛出keyerror,解决方法:重写missing方法- 字典sd, 设置元素sd[i]=i,得到元素 sd.getvalue(i)- 储存 like_dict['a']=we- 得到dict类型的key和value print(dict.keys()) print(dict.values())- 遍历字典 for (k,v) in dict.items() 1. #### list 和tuple 的相同点和不同点 - list和tuple 可以相互转换,list可变,tuple不可变 - tuple比list更快更安全 - tuple是可以hash的,list不行 2. dict的内部实现,算法的实现 tuple 和list作为dict 的key值有什么问题: 3. python的多进程,协程实现和多线程 GIL全局锁 #### 查看dict 是否有某个key值 dict.get(key)- 字典的复制 dict.copy()- python字符串反转 str[::-1]- extends 函数a=[1,2,3,4]b=[1,2,3,4,5]a.extend(b for i in b not in a)a=[1,2,3,4,1,2,3,4,5]### 字典20.判断一个属性是否在字典中 print d.has_key('site') if 'sa' in dic.keys(): 应该用后面的,python3不能用前面的了?21: if value[i].get(each[i]) == None: value[i][each[i]] = 1 else: value[i][each[i]] += 122.import sys   sys.version  import django  django.VERSION 查看各种安装包的版本23.启动ipython python3 -m IPython notebook-----------# python 的魔法函数## list__set__item(): __get__item():__ len __ 求元素的长度__delete_item()通过类似于list的用法,实现修改和插入。 通过对方法的重写,方便## function__repr ___ 将对象用字符串表示出来,如果没实现,输出类似于__str __是在调用 str()函数时,或者print 时才会使用

__doc__在方法中''' ''' 写的注释  可以得到

__call__ 调用函数的对象时默认执行的方法,可以重写

### 下划线

单下划线,私有变量  不能通过导入来调用

双下划线,受保护变量 子类也不能调用

前后下划线: 系统定义的名字

## 函数式编程

map(func,rang(2)) 将func函数的返回值写入list,然后将list返回

print reduce(lambda x, y: x * y, range(1, 5)) 将1,2传入然后计算出结果,x=2,y=3,然后将结果给x,再找一个数给

---------------

### pickle

1.pickle存中文字符

    pickle.dump(json.dumps(data,ensure_ascii=False),output)

2. pickle 写文件时必须指定文件名

# I/O操作

####  按行读取

```import csv

with open('A.csv','rb') as csvfile:

reader = csv.reader(csvfile)

rows = [row for row in reader] print rows

```

#### 一次读取为str

with open('html.txt','r') as opener:

html=opener.read()

#### 按行读取,忽略首行元素

headers=next(reader)

## 追加写入csv文件

with open("filename.csv","a+") as csvfile:

rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)

a+表示追加写入

w    以写方式打开,

a    以追加模式打开 (从 EOF 开始, 必要时创建新文件)

r+    以读写模式打开

w+    以读写模式打s开 (参见 w )

a+    以读写模式打开 (参见 a )

rb    以二进制读模式打开

wb    以二进制写模式打开 (参见 w )

ab    以二进制追加模式打开 (参见 a )

rb+    以二进制读写模式打开 (参见 r+ )

wb+    以二进制读写模式打开 (参见 w+ )

ab+    以二进制读写模式打开 (参见 a+ )

## csv

将list写入csv文件

writer=csv.writer(open('ip_message.csv','w'))

### 按行写入

writer.writerow(fields)

for i in result:

    writer.writerow((i,result[i]))

#### 将dict 写入csv文件

```

with open('dict.csv', 'wb') as csv_file:

    writer = csv.writer(csv_file)

    for key, value in mydict.items():

      writer.writerow([key, value])

```

#### 将tuple 写入csv

```

def write_in_csv(tuple):

    with open('message.csv', 'a')as opener:

        writers=csv.writer(opener)

        writers.writerow(tuple)

```

## 文件目录和文件读写

```

print(__file__)

print(os.path.abspath(__file__))

上面文件目录

path=os.path.abspath(os.path.dirname(__file__))

image_path=os.path.join(path,'dataset')

# 将目录下文件名转换为List

file=os.listdir(image_path)

```

# yeild

## 回调函数

将一个函数以参数形式传到另一个函数中

--------

# 输出

## 输出格式

print ('a%sb%s'%(a,b))

### format

print('好的代理:{}'.format(each))

#### 多个format

print("sd{1}{0}".format(b,a))

----------https://www.baidu.com/s?wd=14.118.254.90

将变量放在字符串中输出

```

cc=China

url='{}/{cc}/{cc}.gif'.format(BASE_URL,cc=cc.lower())

http://flupy.org/data/flags/china/china.gif

```

## 不换行输出

pyhton2:

## 编码

中文无法显示的话

i.decode(encoding='utf-8')

--------

# Exception

## raise

类似于java 中的throw  可以根据情况自己抛出异常

if response.code==200:

    raise RuntimeError("wwe")

except RuntimeError as e:

    print(e.args)

ValueError 数据转换异常

IndexError 数组下标异常

在异常中加的参数作为args参数

### 自定义异常类

class OutboundsError(Exception):

    def __init__(self,errormsg):

        self.errormsg=errormsg

    def __str__(self):

        print("调用了这里")

        return self.errormsg

当打印对象时会调用 __ str__ 方法

### except

多个异常:

(KeyError,FilenotFoundError) as e:

## 配置logging

首先new一个handler

RotatingFileHandler

然后添加到app.logger

------

# 日期和日历

## datetime

```

a = datetime(2012, 9, 23)

```

from datetime import datetime

获得过几天的日期

yesterday = today - datetime.timedelta(days=1) #用今天日期减掉时间差,参数为1天,获得昨天的日期

tomorrow = today + datetime.timedelta(days=1) #用今天日期加上时间差,参数为1天,获得明天的日期

print(afterday.year)

print(afterday.month)

print(afterday.day)

------

# 神奇的函数

### lambda 表达式的学习

a=[1,2,3,4]

g=lambda x:x**2

for each in a:

    print(g(each))

pydoc3 -p:5000 在5000端口查看消息

##### 根据 字母表获得 所有字母

a=[chr(i) for i in rang(97,123)]

ord(a)=97

#### sys.argv[1]

#### 在console导入路径或者py文件

import sys

sys.path.append("/path/to/your/test.py")

### 迭代器

```

a=iter(a)

print(next(a))

```

next函数,返回迭代器的下一个对象

## 并发

并发是指一次处理多件事。

并行是指一次做多件事。

二者不同,但是有联系。

一个关于结构,一个关于执行。

并发用于制定方案,用来解决可能(但未必)并行的问题。

### yield

### 协程

```

def simple_coroutine():

    print('corroutine is start')

    x=yield

    print('corrountine reeived',x)

mycoro=simple_coroutine()

print mycoro

next(mycoro)

#向yield发送一个值,输出x为23

mycoro.send(23)

```

###### 先要调用next函数,作为预激协程的指令,让协程跳转到第一个yield表达式  产出变量的初始值None

next函数可以包装为装饰器

```

def start(func):

    def star(*args,**kwargs):

        sd=func(*args,**kwargs)

        next(sd)

        return sd

    return star

```

个人体会:通过send语句将值传递给yield对象

执行下一个yield让协程进入下一个状态

当执行完后,协程为yield状态

python3 查看生成器状态:

##### from inspect import getgeneratorstate

协程来处理异常类:

如果传入的异常无法处理,协程就会终止

协程的四个状态:

gen_created: 等待开始执行  (只有在多线程应用中才能看到)

gen_running:解释器正在执行

gen_suspended:在yield表达式处暂停

gen_closed 执行结束

类似于return 的关键字,返回的类型为生成器

不过不会直接退出函数

而是等到 循环结束,返回一个list

#### yield from

可以简化yield语法

###  GIL

global interpreter lock 全局解释锁

一次只能有一个线程在运行

gIL对io密集型任务 的影响很小

Python 标准库中的所有阻塞型 I/O 函数都会释放 GIL,允许其他线程运

行。time.sleep() 函数也会释放 GIL。因此,尽管有 GIL,Python 线程还是能在 I/O

密集型应用中发挥作用

当某个线程在等待I/O时,python调度程序会切换到另一个线程

ProcessPool 使用了多进程来绕开多线程

### cpu密集

ProcessPoolExecutor  多进程的 多少个核就有多少个进程

multiprocessing  绕开GIL

python-parallelize库

定义一个python-parallelize 装饰器,可以应用到任何函数上

生成器: 类似于链表推导,

只不过只会放入内存一次

也就是说只能输出一次,用完就没了

#### *args,**kwargs

*args是tuple

**kwrgs是dict

def play(*args,**kwargs):

    print(args)

    print(kwargs)

(2, 3)

{'age': 3, 'name': 2}

play(2,3,name=2,age=3)

#### filter 函数

过滤函数?

- a=range(10)

print(filter(lambda x:x>3,a))

#### random

values=[1,2,3,4]

- random.choice

random.choice(values)

从List中随机选择元素

- 提取出n个不同的样本

random.sample(values,2)

- random 打乱顺序

random.shuffle(values)

- 生产随机整数

random.randint(0,10)

- 生成0-1 范围内均匀分布的浮点数

random.random()

- 生成n位随机二进制整数

random.getrandbits(200)

### 运算符

& 按位运算符 取交集

| 按位运算符  取并集

^ 当二进制位不相等时,取1

~ 按位取反

<< 左移运算符  高位丢弃,低位补0

>> 右移,低位丢弃,高位补0

### 生成器

节省内存

```

pos = (n for n in mylist if n > 0)

for each in pos:

print each

```

- 列表推导

  b=[for each in b if b>0]  //占用内存比较多

- 求list中最大的元素

  print(max(mylist))

- chr(97)-> a  输入数字,输出字母

- join 函数, b.join(a)  b加入a中 每个b加入到a的每个元素中

  a="sbv"  b="-"  c=b.join(a)

  print(c)

- xrange返回的为xrange类型,本质为生成器,性能不会放入内存

### input

input 会自动判断类型

raw_input不会

input 输入不能有空格

raw_ input可以

还是raw_input合适点

### id

查看变量地址空间

##### isinstance和type的区别

isinstance 是广义上的判断,可以根据父类来判断

----

# 面向对象

## 继承

## 构造方法的初始化

```

class A:

    def spam(self):

        print('A.spam')

class B(A):

    def spam(self):

        print('B.spam')

        super().spam()  # Call parent spam()

```

----

## 抽象类

## 装饰器

装饰器是可调用对象,其参数是另一个函数

不改变函数的前提下,增强函数的功能

在导入时执行调用

1. @property

将方法变为属性

本质是为了增加原的功能。

将原函数作为参数传到另一个函数中

相当于方法套了一层方法。

def identify(f):

    print(f())

    return ()

def foo():

    return 'bar'

identify(foo)

上面等价于:

def identify(f):

print(f())

@identify

def foo():

return "sd"

闭包;

## 一些坑

- a//2 还是int 类型  a/=2 就是float类型

-----

## pip

- pip list --outdate

列出所有可以升级的软件

-  pip install  --upgrade requests

升级一个包

- 升级所有可用的包

for i in `pip list -o --format legacy|awk '{print $1}'` ; do pip install --upgrade $i; done

# OS

__ file __ 属性为当前py文件的路径

execv(file,args)

execv()执行一个新的程序,用新的程序代替子进程的空间

### 面试问题

1. 深拷贝和浅拷贝的区别 深拷贝和浅拷贝复制一个对象,然后把之前的对象删掉,引用技术应该怎么变

2. 对一个对象进行如何操作才能使他的引用计数增加或者减少

3. python垃圾回收机制

4. 复制一个list的方法

5. python内部list和tuple的实现的数据结构 数组

6. 数据库索引,b树和b+树的实现和区别,为什么不用红黑树

7. ping的端口号 基于什么协议的

  基于iCMP协议,没有端口号  控制报文协议

8. python    _ _init_ _方法和_ _  _new_ _的区别

  new: 创造对象是调用,会返回当前对象的一个实例

  init: 创造完对象后调用,无返回值

  同时存在,会优先调用new方法

  new_是静态方法,init是实例方法

9. python的闭包函数  变量在闭包中调用的次序

10. 每行大小为16个字节,总共1G大小的文件,限制内存1MB,找出频率出现次数最多的单词

    解决方法: 1mb内存可以处理 2^16次方个单词,首先进行切分为100个文件,然后

11. 如何从一个很长的字符串来找一个子字符串 KMP算法

哪些是可变类型

哪些是不可变类型

深拷贝和浅拷贝的区别

装饰器的特点

装饰器有哪些优点

1. 便于开发

2. 便于代码复用

3.

## python语言内部

#### 内存管理

1. 引用计数

将一个对象放入列表中,引用增加

分配一个新的名称,引用增加

引用计数减少: 显式的销毁

sys.getrefcount( )函数可以获得对象的当前引用计数

2. 垃圾回收

  当引用计数清零时,垃圾回收机制


3. == 和is 的区别 

  ==比较对象的数据,is比较对象的标识(id)


4. copy和deepcopy

  copy了后,内部对象的引用还没有变,仅仅是复制了表面

  deepcopy是递归复制,完全是两个不同的对象

5. numpy就是一个很好地例子,它的运行速度真的非常快,因为很多算术运算其实并不是通过Python实现的。


6. 答:“猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为。

7. 偶尔也会出现引用循环(reference cycle)。垃圾回收器会定时寻找这个循环,并将其回收。举个例子,假设有两个对象o1和o2,而且符合o1.x == o2和o2.x == o1这两个条件。如果o1和o2没有其他代码引用,那么它们就不应该继续存在。但它们的引用计数都是1。

8. 答:print的输出是标准输出,可以指向任何可以输出的流,包括http输出

9. 闭包: 外部函数的返回值必须是内嵌函数,可以通过外部函数的返回值来继续调用内嵌函数,推迟函数的

鸭子类型:

走起路来像鸭子,只关心行为

又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268