当自家套完Python时我学了几什么

本文是本身拟完Python后的同一整回顾,加深理解而已,Python大神请过~

学Python的这几天来,觉得Python还是比较简单,容易上手的,就基本语法而言,但是小高档特性掌握起来或有来难度,需要时刻错开化。Python给自己不过深的印象就是是简单,这吗多亏自己何以不顶喜欢Java的原因有。

一、Python简介

    Python是同样种植用来修应用程序的高级程序设计语言,TIOBE程序语言排行榜2015年12月底排名如下:

图片 1Python实现强势逆袭,而且我深信不疑,随着时空之推迟,国内Python语言未来前景也是平等切片为好。

   
Python的特点是优雅简单,易学易用(虽然我深感还是有一部分概念不易于理解),Python的哲学是拼命三郎用极端少之,最简单易行好亮的代码实现需要之意义。Python适宜吃开发网络使用,脚本写作,日常简单多少器等等。Python的弱点是效率比逊色,但是在大气底场地效率也未是那要或者说Python不是该性瓶颈,所以并非太注意。其次是2.x-3.x的连接使得广大3.x尚缺很多2.x生的模块,不过为当到中。其次就是是源代码无法加密,发布Python程序其实就算是发布源代码。

次、基础语法要点

1.如一个字符串中有成千上万亟需转义的字符,而与此同时不思写那基本上’\’,那么可就此
r’…’ 表示 ‘…’内的内容未转义。

2.Python可用”’…”’来代表多实行内容,如:

>>> print('''line1
line2
line3''')
line1
line2
line3

3.Python底逻辑运算and,
or, not 分别针对许C语言中的&&, ||, !.

4.Python之整数与浮点数大小都不曾范围。

5.Python中除法有半点种:
‘/’除出来必是浮点数, ‘//’除出来是整数,即地板除。

6.Python中举都引用。每个对象还出一个引用计数器(内部跟踪变量)进行跟踪,引用计数值表示该对象有稍许只援,当初差发出与给变量时,引用计数为1,其后没展开下列行为负之轻易一种都见面追加引用计数:

赋值:  a = b
用作函数参数传递: func(a)
成为容器对象的一个元素: lis = [1,2,a]

以下任意一种植行为还见面压缩引用计数:

del销毁: del a
变量另赋给其他对象:a = False
对象从容器中删除:  lis.remove(a)
身在的容器被销毁: del lis

7.深正片与浅拷贝的定义以及比,有硌复杂,看顿时篇稿子

8.list,tuple和dict,set

list:
为列表,是一个不变聚集,类似于数组但又比较数组功能强大,可以随时append,pop元素,下标从0开始,且下标为加n模n制,即lis[-1]
= lis[len-1],下标范围[-len,len-1].

tuple:为元组,类似于list,但list为可变类型,而tuple不可变,即无append,pop等函数。一个建议是为了安全起见,能用tuple代替list尽量用tuple。如果tuple只生一个元素,要描绘成要(1,)以避免歧义。

dict:字典类型,存放key-value键值对,可以因key迅速地搜寻来value,当然,key必须是不可变类型,如下是不对的:

>>> dic = {[1,2]:'value'}
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    dic = {[1,2]:'value'}
TypeError: unhashable type: 'list'

list与dict的好坏对比:

dict:
   1.插入,查找速度快,跟key的数目无关
   2.需占用大量内存,内存浪费严重

list:
   1.插入,查找速度慢,O(n)的复杂度,随元素个数增加而增加
   2.占用内存小

dict内部存放的相继与key放入的相继是从未关系的

set:set与dict类似,相当给仅仅出key没有value的dict,每个key不同,set间发生
&, | 等操作对应集合的至,并操作。

三、函数

1.函数凡是目标,函数名即是依赖于对诺函数对象的援,所以可以用函数名赋给一个变量,相当给被函数起一个‘别名’。

>>> mmm = max
>>> mmm(1,2,3)
3

2.Python函数可以回”多只价“,之所以打引号,是盖实在返回的基本上独价值拼成了一个元组,返回这个元组。

3.概念默认参数需要记住:默认参数必须依于非换对象。否则第一糟糕调用和次蹩脚调动用结果碰头无雷同,因为可变的默认参数调用后改成了。

4.不过转换参数:传入的参数个数是可变的,可以是0个或多独。可转移参数会将公传入的参数自动组装为一个tuple。在您传入的list或tuple名字前加一个
* 即说明传入的是只是换参数。习惯写法为*args。

5.关键字参数:传入0独或多独包含参数曰之参数,这些参数为自动组装成一个dict。习惯写法**kw,如**a表示将a中享有的键值对以主要字参数的形式传播kw,获得一个dict,这个dict是a的同一份拷贝,对kw改动不见面传递及a

6.命名关键字在函数定义着同于一个*分割符后,如

def func(a,b,*,c,d):
    pass

c,d为命名主要字参数,可以界定调用者可以传的参数曰,同时可以提供默认值。

7.参数定义顺序:必选参数,默认参数,可转移参数/命名第一字参数,关键字参数。

8.切片操作格式为lis[首下标:尾下标:间隔],如果都非填,即lis[::]虽意味整个容器lis

9.为此圆括号()括起来一个列表生成式创建一个生成器generator,generator保存生成算法,我们得据此next(g)取得生成器g的生一个回去值。生成器的补益虽是咱们无待超前转移有列表元素,而是需要经常再生成,这当一些情况下得以节约成千上万内存。算法为足以免是列表生成式而是自定义函数,只需要于函数定义着包含yield关键字。

10.map()和reduce():
二者都是高阶函数。map()接收两独参数,一个凡函数,一个是Iterable序列,map将盛传的函数依次作用在列每一个要素上,并将结果作新的Iterator返回。reduce()类似累积计算版的map(),把一个函数作用在一个班上,每次收到两只参数,将结果连续与序列的下一个元素做累积计算。

运用map和reduce编写一个str2float函数,如将字符串’123.456’转换成浮点数123.456:

from functools import reduce

def str2float(s):
    def f1(x,y):
        return x*10 + y
    def char2num(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    def f2(x,y):
        return x*0.1 + y
    a,b = s.split('.')
    print('a=',a)
    print('b=',b)
    return reduce(f1, map(char2num,a)) + 0.1*reduce(f2, map(char2num,b[::-1]))

print('str2float(\'123.456\') =', str2float('123.456'))

11.fliter()函数过滤序列,类似于map()作用被各个一元素,根据返回值是True或者False决定放弃还是封存该因素。函数返回一个Iterator。

12.sorted()函数可实现排序,类似于C++库中之sort()函数,但是于那更加简明,语法为sorted(lis,key=func,reverse=T/F)

key函数可实现从定义之排序规则,reverse代表升序还是降序。

13.一个函数可以回来一个函数,但是回去时该函数并未实施,所以回来函数中永不引用任何可能发生变化的变量,否则会起逻辑错误。

14.装饰器(decorator):
当需要增强函数的功用可未欲修改函数自己,那么可以以装饰器这种运行时动态增加效益的方法,增加的职能卸载装饰器函数中。如以执行前后打印’begin
call’和’end call’,可以这样做:

import functools

def log(func):
    @functools.wraps(func)     #为了校正函数签名,最好写上
    def wrapper(*args,**kw):
        print('begin call')
        f = func(*args,**kw)
        print('end call')
        return f
    return wrapper

@log
def hah():
    print('hahahaha')

hah()

begin call
hahahaha
end call

15.偏函数:
functools.partial(),作用是拿一个函数的某些参数固定住,作为新函数的参数,即一定住该参数,返回一个初函数,使调用更简单。

季、面向对象编程

1.Python实例变量可以随心所欲地绑定任何性质

2.以不给内部属性不受外表看,在性之名号前增长两单下划线__,这样就算成了一个私有变量(private),注意,不能够一直访问不意味一定不克看,事实上,加双下划线后Python就会拿其改名为‘_class名__name’,所以要好如此来拜会是‘私有’变量。

3.对于静态语言,如果要求传入一个class类型的目标,那么传入的目标要是class类型或者其子类,否则将无法调用class中之方法,而Python这样的动态语言有‘鸭子类型’一说,即非必然要是传播class类型或其子类,而设保证传入的目标被起使使的法门即可。

4.设想使限量实例可以绑定的性能,那么以定义class时定义一个__slots__变量即可,例如:

class Student(object):
    __slots__ = (‘name’,’age’)

注意,__slots__限定的习性对现阶段类实例起了限制作用,且跟子类共同定义其__slots__,也就是说子类可以定义自己之__slots__,子类实例允许定义的性质就是本人的__slots__丰富父类的__slots__,即并集。

5.@
property装饰器可以假设一个getter方法变成属性,如果艺术名吧me,那么@me.setter装饰器则可要是一个setter方法变成属性。这样可以假设代码更简单,同时可对参数进行必要的反省。

6.由此多双重继承,可如果子类拥有多单父类的有机能。

7.在类中__call__主意可要是实例对象像函数那样直接调用,作用就凡拖欠方式定义的长河。

8.ORM(Object
Relational Mapping
对象关系映射),就是拿关系数据库的一行映射为一个对象,也尽管是一个近乎对应一个发明。ORM的贯彻内需经metaclass元类修改类的概念。元类可以改类创建时的所作所为。

五、调试

1.Python调节方法:

   
(1)直接打印

   
(2)断言

   
(3)pdb

   
(4)IDE

六、IO编程

1.序列化:
把变量从内存中成可存储或传输的历程叫序列化。Python用pickle模块实现序列化。序列化之后,就可拿序列化后的内容存储到磁盘上或经过网络开展传输。pickle.dumps()将对象序列化成一个bytes,而pickle.loads()可以根据bytes反序列化出目标。

2.pickle不怕好,但是它们把为Python而生,所以若在不同语言里传递对象,最好要xml或者json,而json表示格式是一个字符串,更爱读取,且较xml快,所以更适宜吃对象序列化。Python内置了json模块,相应措施还是dumps()和loads()。

3.而在默认情况下,有些对象是无能为力序列化的,所以我们偶尔还索要定制转换方法,告诉json该怎么以某类对象转换成可先后列为json格式的{}对象。如下即是一个转换方法:

def mantodict(std):
    return {
        'name': std.name,
        'age': std.age,
        'id': std.id
    }

七、进程和线程

1.Python之所以mutiprocessing模块来兑现多进程。

2.若一旦大量创建子进程,可以行使进程池:

from multiprocessing import Pool

示范如下:

.... 
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

假如动过程池需新建Pool对象,对Pool对象调用join()使等待池中所有子进程运行了,调用join()方法之前须调用close(),且下无法还新加子进程。

3.下subprocess模块可好之启航并管制一个子过程,控制该输入输出。

4.进程间通信使用Queue,Pipes实现。

5.threading模块管理线程。threading.lock()创建线程锁,防止以做客互斥资源造成的左,示例如下:

lock = threading.Lock()
...
lock.acquire()
...
change(mutex)
...
lock.release()

6.ThreadLocal足以解决参数在一个线程中相继函数之间相互传送的题材。

7.managers模块实现分布式进程。

八、正则表达式与常用内建模块

1.re模块进行正则表达式编译和匹配,如果该表达式需要相当很频繁,那么最好开展编译从而大大节省时间。

正则表达式匹配邮箱例子:

import re

hah = re.compile('[0-9a-zA-Z]+[\.[0-9a-zA-Z]+]*\@[0-9a-zA-Z]+\.[a-z]{2,3}')
print(hah.match('someone@gmail.com').group())
print(hah.match('bill.gates@microsoft.com').group())
i = 1
while i < 10:
    r = input('请输入邮箱:')
    print(hah.match(r).group())
    i = i+1

2.datetime模块进行日期与时之处理,每一个时日对应一个timestamp,我们拿1970年1月1日
00:00:00 UTC+00:00时常区之天天称为epoch
time,记否0(1970年先的年华timestamp为负数),当前日子虽是相对于epoch
time的秒数,称为timestamp。字符串和datetime也得以相互转换,采用strptime()方法,字符串转换为datetime时要设定一个分辨格式,其中

%Y-%m-%d %H:%M:%S

分级代表年-月-日
时-分-秒。

自datetime得出月份,星期齐字符串用strftime()方法,其中:

%a, %b %d %H:%M

分别代表星期,
月份 日期 时:分。

示例:

from datetime import datetime

r = '2015-11-23 12:01'
dt = datetime.strptime(r, '%Y-%m-%d %H:%M')
print(dt)

week = dt.strftime('%a %b %d, %H:%M')
print(week)
2015-11-23 12:01:00
Mon Nov 23, 12:01

3.collections凡Python内建的一个聚集模块,提供了成百上千灵光的集合类。

4.Base64凡是一模一样种植任意二迈入制到文本字符串的编码方法,常用来在URL、Cookie、网页中传少量二进制数据。

5.struct模块用来解决bytes和另外二进制数据类型的换。

6.Python的hashlib提供了广大的哈希算法,如MD5,SHA1等等。hashlib实现简单登录:

import hashlib

db = {
    'michael': 'e10adc3949ba59abbe56e057f20f883e',
    'bob': '878ef96e86145580c38c87f0410ad153',
    'alice': '99b1c2188db85afee403b1536010c2c9'
}

def get_md5(ostr):
    md5 = hashlib.md5()
    md5.update(ostr.encode())
    return md5.hexdigest()

def login(user, password):
    r = get_md5(password)
    for name in db:
        if db[name] == r:
            return True
    return False

print(login('bob','abc999'))
True

7.Python底内建模块itertools提供了要命实惠之用来操作迭代对象的函数。

8.urllib资了一如既往层层用于操作URL的效力。如GET,POST…

9.PIL(Python
Imaging Library
Python图像库)是一个无敌的图像处理标准库,功能强大却又简约容易用。现在底讳叫做Pillow。可以如下安装Pillow:

pip3 install pillow

自打脚生成数字验证码的先后可以窥其一斑:

图片 2图片 3

from PIL import Image, ImageDraw, ImageFont, ImageFilter

import random

# 随机字母:
def rndChar():
    return chr(random.randint(48, 57))

# 随机颜色1:
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象:
font = ImageFont.truetype('ariblk.ttf', 40)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())
# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')

View Code

效果:

图片 4

九、网络编程和电子邮件

1.大网编程主要是TCP和UDP的编程,示例见【Python网络编程】利用Python进行TCP、UDP套接字编程

2.SMTP凡发送邮件的商议,Python内置对SMTP的支撑,可以发送纯文本邮件、HTML邮件与带来附件的邮件。Python对SMTP支持有smtplibemail鲜独模块,email荷组织邮件,smtplib顶住发送邮件。Python内置一个poplib模块,实现了POP3商事,可以一直用来收尾邮件。由于现在大部分巨型邮件服务商都采取了反倒垃圾邮件方式,所以马上有之简便实验并不曾水到渠成,还需更研究,等逢具体情况再说。

3.Python内嵌了sqlite数据库,还得自动设置连接mysql,MySQL是时极风靡的开源数据库,在同行业内拥有广泛的以。

十、Web开发与异步IO

1.WSGI(Web
Server Gateway Interface) 服务器网关接口。

2.Python
web 开发框架:

   
-Flask:流行的Web框架

   
-Django:全能型Web框架

   
-web.py:一个细的Web框架

   
-Bottle:和Flask类似的Web框架

   
-Tornado:Facebook的开源异步Web框架

3.协程

 

参照读物

1.廖雪峰Python教程【见友情链接】

网站地图xml地图