python3.5基础学习

一、基础

1.数据类型和变量

#if else语句
name = 'qqqq'

if name=='qqq':
    print('true')
    print('还是在if里面')
elif:**********
else:
    print('false')

#转义字符
print('dfdf\ndsfsd')

#取消转义
print(r'\n\tsdfsfsd')

#多行内容
print('''line1
line2
line3''')

2.list和tuple

#list展示
mylist = ['num1','num2','num3','num4']
length = len(mylist)

#list长度
print(length)

#取值
print(mylist[1])

#取最后一个
print(mylist[-1])#负数代表从后往前第几个数据

#追加数据到list中
mylist.append('num5')

#insert到list中
mylist.insert(1,"num6")

print(mylist)

#删除最后一个
mylist.pop()
#删除指定位置
mylist.pop(1)

###################################
#tuple 类似list,但是建立之后不能修改
mytuple = ('t1','t2','t3')

#定义一个元素的tuple时,在后面加上分号,以免歧义
mytuple1 = (1,)
#tuple是不可变的,但是在里面如果有list,知识说明list的头指针不变,但是里面的内容是可以变的。

3.循环语句

#for 循环
sum=0
mylist = [1,2,3,4,5]
for i in mylist:
    sum=sum+i
print(sum)

sum1 = 0
#range(n)是指0到n-1之间的整数
for j in range(101):
    sum1+=j
print(sum1)

#while循环
while sum1 > 100:
    sum1-=100

4.dict和set

#dict(即key-value对)
d={'num1':1,'num2':2,'num3':3}
print(d['num2'])

#也可以赋值
d['num2']=100

#取数据
#直接取d['num2']
#使用get取
result = d.get('num2',-1)#好处是娶不到可以用默认值,不会报错
#也可以先判断在不在里面
if 'num2' in d:
    result = d['num2']
else:
    result = -1

#pop删掉
d.pop('num2')

#set
s=set([1,2,3])
s.remove(1)#删掉元素1,而不是第几个元素,因为set内部元素没有次序

#set的交际并集采用&和|

5.函数

常用简单内置函数:
abs,max,hex,int()转换成int,float()转换成float
新建myfunction.py文件,


def my_abs(x):
    if not isinstance(x, (int, float)):#判断类型,只有整形和浮点型才行
        raise TypeError('bad operand type')
    if(x>=0):
        return x
    else:
        return -x

内容就是求绝对值,
然后再在调用的py里面,

from myfunction import my_abs
i=my_abs(-5)
print(i)

使用from指明函数来自哪里,使用import知名要导入哪个函数。

返回多个值可以直接逗号分开,其实就是返回的tuple

python会记得默认参数的值,因此默认参数一定要只想不变对象!可以使用None代替
def add_end(L=None):

如果不确定入参数量,可以用list或者tuple传入,但是需要组装一个list,优点麻烦。python有可变入参,在参数名前面加上*号就行了,在里面把这个入参当做list使用。

python支持关键字传参。比如
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)这个方法,我可以这样调用
person('Adam', 45, gender='M', job='Engineer'),得到的结果是:
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
很厉害是不是!特别是在一些上传数据的情况,不一定每一个都上传,只需要把需要的整合一下上传就好。有点类似于builder模式。

6.切片(字符串截取)

mylist = ['num1','num2','num3','num4']
print(mylist[1:3])

使用[:]方式来进行,[1:2:3]每隔3个取一个数

7.列表生成器

[x * x for x in range(1, 11)]就生成了[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
还能跟上条件语句
[x * x for x in range(1, 11) if x % 2 == 0]
[s.lower() for s in L]#全部转小写

二.函数式编程

1.高阶函数

函数名可以赋值给某一个变量,如下:

a=abs
print(a(-10))

将abs函数赋值给a,照样能够用a()来代表原来的abs()
高阶函数就是能够将函数作为参数传递,比如下面

def add(x, y, f):
    return f(x) + f(y)

2.map/reduce编程

map就是对每一个元素进行操作,比如我想计算list中每一个元素的平方,可以这样写

def f(x):
    return x*x
r=map(f,[1,2,3,4,5])
print(list(r))

reduce和map相反,reduce是对整体的list进行操作,比如想对整个list求和:

from functools import reduce
def fn(x,y):
    return x+y
i = reduce(fn,[1,2,3,4,5])
print(i)

map树输入整体,一个一个计算,输出一个整体。reduce是输入整体,函数是一个一个计算,最后输出一个数。reduce需要引入functools文件中的reduce库

python内置的函数名

面向对象的编程

1.定义类,然后都按照类来操作

class Student(object):
    def __init__(self,name,score):
        self.name = name
        self.score = score
    
    def print_score(self):
        print('%s:%s' % (self.name,self.score))

bart = Student("bart",100)
lisa = Student('Lisa',60)
bart.print_score()
lisa.print_score()

如上,使用init来进行构造,构造的第一个参数放入self,相当于this,其余的function都需要放入self。但是调用的时候不需要传入self。

访问权限

如果不想变量被外部访问,在前面加上两个_就行,比如上面的就变成:

self.__name = name
self.__score = score

这样就需要先通过类名在访问变量名,即_Student__name这样访问。不建议这么做,因为python可能会把内部的变量名改掉。
通过getset方式进行数据赋值控制。

继承

class Dog(Animal):其实这就让Dog继承了Animal

python是一种动态语言,当需要一个A类型是,不一定传入A,可以传入一个和A中函数名一样的类。而静态语言(如java)中就不行。
动态语言创建一个类,可以为这个对象添加额外的属性。

对象类型

使用type可以判断属于哪一种类型,
type(123)==int是True
对于class的继承关系,使用isinstance(),子类的对象属于父类的实例,而父类创建的对象就不属于子类的instanse。

为实例添加属性和方法

from types import MethodType

class Student(object):
    pass

#为实例添加属性name
s=Student()
s.name = 'hond'
print(s.name)

#为实例添加方法设置name
def setname(self,name):
    self.name = name

Student.setname = setname
s.setname('jack')
print(s.name)

设置属性的时候直接设置就行,设置方法的时候,先定义方法,定义的时候要把对象使用sel传递进去。然后再使用MethodType将方法赋值给对象,之后就能调用了。
使用slots来限制绑定的属性,比如:

class Students(object):
   __slots__=('name','age')

就只允许添加name和age的属性。slots属性只对自己有效,对子类是没有效果的

属性的读写

可以使用@property来控制读,使用@属性名.setter来控制属性的写

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

上面代码中,birth可以直接读取,也可以直接写入

错误处理代码

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

三. IO文件操作

读取文件

f = open('/Users/michael/test.txt', 'r')
for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

内存读写

(1)使用StringIO操作string数据,有两种方式

from io import StringIO
f=StringIO()
f.write('dddddddd')
f.getValue()

还有一种

from io import StringIO
f=StringIO('Hello!\nHi!\nGoodbye')
while True:
    s = f.readline()
    if s=='':
        break
    print(s)

读写多行的数据

(2)使用BytesIO操作二进制数据

from io import BytesIO
f = BytesIO()
f.write(b'\xe4\xb8')

序列化

(1)固化到文件的序列化
python中的序列化叫pickling

import pickle

#将一个dict写进文件,二进制
f=open('1.txt','wb')
d=dict(name='hond',age=20,score=80)
pickle.dump(d,f)
f.close()

#从文件读取
g=open('1.txt','rb')
d=pickle.load(f)
g.close()
print(d)

(2)json序列化

import json
d=dict(name='hond',age=20,score=88)
print(json.dumps(d))

对于类的json,可以先将类转换成dict,再序列化

四.进程和线程

1.创建简单进程

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')

使用multiprocessing创建Process类,初始化时分配给这个进程任务。然后使用start和join进行控制

2.创建多个子进程

使用Pool进程池

from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    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分配进程池的个数,然后运行,使用join等待所有子进程结束。
进程间通信时通过pip管道和Queue数据队列进行的。

3.多线程

使用threading.Thread分配新的Thread,并且指定这个Thread干的事情和名字

import time, threading

# 新线程执行的代码:
def loop():
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)

使用threading.Lick()来获取锁,然后再lock.acquire()和lock.release()释放锁

balance = 0
lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 先要获取锁:
        lock.acquire()
        try:
            # 放心地改吧:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()

使用ThreadLocal来管理每一个线程自己的独立数据。

五.常用内建模块

1.datetime

datetime是处理日期和时间的标准库,
基本用法如下:

from datetime import datetime
#获取当前时间
now = datetime.now()
print(now)

#设置指定日期和时间
dt = datetime(2017,3,29,12,20)
print(dt)

#将时间转换成timestamp
ts1 = now.timestamp()
print(ts1)

ts2 = dt.timestamp()
print(ts2)

#从timestamp转换到时间
dt2 = datetime.fromtimestamp(ts2)
print(dt2)
#到utc标准时间
dt3 = datetime.utcfromtimestamp(ts2)
print(dt3)

2.一些集合(collections模块)

deque双向链表
defaultdictkey不存在是返回‘N/A’
orderedDict表示key有序的map,相当于linkehashmap。按照插入的key的顺序排列。

3.使用hashlib模块进行摘要运算,比如MD5,sha1等等

4.使用with语句进行资源的调用

这一点和C#很类似,使用with调用资源,在with块结束的时候系统会自动释放这个资源。比如:

with open('/path/to/file', 'r') as f:
    f.read()

一般的类也可以采用with,但是毕竟需要释放资源,因此需要写好AOP的两个函数,一个是with开始的wnter函数,表示with开始,一个是exit函数,表示with结束,清理一些资源
既然说到了AOP,其实这一段也可以使用pythod的AOP @contextmanager来进行,


@contextmanager
def create_query(name):
    print('Begin')
    q = Query(name)
    yield q
    print('End')

开始时begin,结束时采用yield进行结束。

如果一个对象没有上下文,可以使用closing进行资源关闭,一样可以用在with中

5.urllib进行数据获取

下面代码获取一个api的数据

from urllib import request

with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))

    print('Data:', data.decode('utf-8'))

目前已经出了urllib2,可以代替原先的urllib,使用urllib2.urlopenurllib2.Request进行数据请求

六.IO

1.协程

协程是更加轻量级的线程,但是不需要耗费线程之间的切换代价,因此,使用协程有时候是最好的方案
下面的代码是哟个生产者和消费者模型

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
    c.close()

c = consumer()
produce(c)

produce使用send提供生产的数据,并且有返回值,consumer接收到数据后,使用yield接收到r这个返回参数,并且将这个返回参数填上返回数据,producer之后就能够接收到consumer返回的数据了。

2.asyncio

这个库在python3.4才引入进来
原理就是直接使用asyncio获取一个EventLoop的引用,将需要执行的协程直接扔到这个EventLoop中去就行。
如下

import asyncio

@asyncio.coroutine
def hello():
    print("Hello world!")
    # 异步调用asyncio.sleep(1):
    r = yield from asyncio.sleep(1)
    print("Hello again!")

# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()

上面代码中,使用@asyncio.coroutine这个注解告诉编译器,这个里面有异步io,使用yield开始进行协程运算。

3.async/await

python3.5中引入

async def hello():
    print("Hello world!")
    r = await asyncio.sleep(1)
    print("Hello again!")

使用上和其他语言的async/await没什么区别

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

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,480评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,789评论 25 707
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,027评论 0 10
  • 1. 县城上学前,我有过在两次乡下小学的求学经历。 入学时不到五岁,并非刻意提前,只是村里一小孩入学没两月,就哭闹...
    红尘笑笑生阅读 524评论 0 4