python学习

Python语法

2017-11-07  本文已影响28人  Ashen_

*** 环境

安装: brew install python3

python解释器:

开启:python
退出: exit()
执行文件: python xxx.py

输入:input()
 eg: input(),  input("please input somethong...")
输出:print()
 eg: print("aaa"),  print("aaa", "bbb") 逗号自动转为空格

*** 基础

python是动态强类型语言:运行时类型才被确定,类型校验严格,不支持隐式转换
"#": 键作为注释
":": 表示接下来的是代码块
缩进表示在同一个代码块
约定四个空格表示缩进,不推荐Tab
鸭子类型:类似于协议,只需要实现方法就可以,不需继承等

常用代码块

# 条件判断
if True:
        # something
        # s...
elif True:
        # ...
else:
        # other

# 循环
for a in b: 
        #...
while True:
        # ...
        
for else  # for循环中没有break就会执行else内容,条件不满足判断
while else  #同上
try else  # 没有exception会执行else代码段

常用变量

字符串:

b'ABC' #bytes类型
"" 或'', \转义符, 换行相同
格式化: 'Hello, %s' % 'world'       说明: %s等表示格式,  %分割
  eg: "name is %s age is %d" % ("shijian", 18)
'{0}, {1}, {0}'.format("first", "last") # 通过format格式化
"hellow" + "world," + name

ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符
encode('ascii')  # 'utf-8'    .decode('ascii') # 二进制类型的解码
encode('utf-8',errors='ignore')  # ignore, replace(默认字符串)、
len('ABC') # 长度
Chardet工具包:用来猜测文本的可能编码方式

split(sep, maxsplit)  #分割,$0不填默认是空格,$1分割次数
replace(old, new[, count]) #count选填
strip[chars] # 移除指定字符,默认移除空格,只能移除开始和结尾分部分,对中间无效
join(array1) # 将数组转换为字符串,";".join(["a", "b","c"]) = "a;b;c"

HereDoc:所见即所得文本(换行等生效)
s = '''<HTML><HEAD><TITLE>
</BODY></HTML>
'''

Bool: True 或False, and or nor 计算
空值: None
常量: 约定全部大写:PI
if name == 'hello' or name == 'hi' or name == 'bs' or name == 'admin': 可以用 if name in ("", ""):代替
运算:10/3 = 3.33 10//3 = 3

数组:list

[1,2,3]     a[1]  a[-1]#最后一个   a[-2]#倒数第二  
 append #追加
 insert  # 插入
 pop # 删除  pop(i) #删除指定位置
 a[I] =  'bb' # 赋值
 test = a[I] # 取值
 切片
     a[0:3] #从0开始,取3个    
     a[-2:] 取最后2个  
     a[:10] #取前十  
     a[:10:2] 取前十个,隔2取1
     a[::5] 隔5取1
     a[::-1] # 倒序,相当于reverse
     a[1:3] = [1]  # 数量不对等时,相当于删除或增加

元组: tuple

元组是常量   a[1]  a[n]
collections.nameDump     # 自定义一个元组

字典:dict

d = {"a"=123,"b"=23,"name"="shijian"}
d["a"]   # 123
d["a"] = 1
d.get["c", 111]   # 取不到取默认值111
for (k,v) in d.items():   # 遍历

# 两个独立数组可以被压缩成一个字典: zip
numbers = [61, 62, 63, 64, 65]
letters = ['a', 'b', 'c', 'd', 'e']
dict(zip(letters, numbers))

迭代:Iteration

isinstance(a, Iterable)  #是否可迭代
用iter()函数从可迭代对象中获取迭代器
实现了__iter__方法或者__getitem__的类的实例都是可迭代对象

列表生成式

[x * x for x in list] #将list内容分别执行x * x形成新的数组
[m + n for m in 'ABC' for n in 'XYZ']  # 两个数组

生成器generator
g=(x * x for x in range(10))
next(g) 
for循环迭代
生成器另一种表示:yield # 函数定义中包含yield关键字

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b  #遇到yield返回,调用next继续向下执行
        a, b = b, a + b
        n = n + 1
    return 'done'

函数

def name(para):    #函数定义
    # do something
    # 定义空函数可以直接在内容中使用pass

def name(para1, para2 = 10) #默认参数
     必选参数需在前
     默认参数不能是可变对象(想想指针,默认参数指向某个地址)
     如果是可变的默认参数,默认应该为None,在函数内再设置默认值

def name(*paras) # 可变参数
     name(1,2,3) # 直接使用
     name(*list)     list = [1,2,3]   #使用*将list转为可变参数

def name(para1, **kw) # 关键字参数
     name("aaa", age=18,grade=3) # 直接使用
     name("aaa", **bbb) # 使用**将dict转为参数
     kw是参数拷贝,修改不影响

def name(para1, *, name, age) #命名关键字参数, 关键字必须是已经命名的
      必须传入参数名
       name('Jack', name='Beijing', age ='Engineer')
      name(name, age, *args, city, job) #可变参数后面跟命名参数可以省略*

参数顺序: 必选参数、默认参数、可变参数、命名关键字参数和关键字参数
任意函数,都可以通过类似func(*args, **kw)的形式调用

匿名函数:lambda
lambda x: x * x    等价于x*x的函数

f.__name__属性获取函数名称

偏函数:Partial function
f2 = functools.partial(int, base=2)   #生成默认参数为base=2的int函数

装饰器:Decorator 函数动态增加功能

def log(func):
    @functools.wraps(func)     # 将func属性(__name__等)赋值到wrapper
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

@log写在now定义处 等价于   now = log(now)

Python函数可理解为混合传值: 不可变的是值传递,可变的是引用

常用函数

range()
isinstance()
type()    type(123)     type(fn)==types.FunctionType
dir()   获得一个对象的所有属性和方法
hasattr(obj, 'x') # 有属性'x'吗
setattr(obj, 'y', 19) # 设置一个属性'y'
getattr(obj, 'y') # 获取属性'y'     getattr(obj, 'z', 404)#默认值

模块

一个py文件代表一个模块
若干模块组成一个包Package
模块名= package.module
每个包必有一个__init__.py模块

import sys 导入sys模块
if __name__=='__main__'   # 当在命令行运行时才为true,一般用于测试

模块作用域:没有实质控制private
约定以_开头的不应被直接使用

安装第三方模块: pip/pip3
pip3 install pillow   # 安装pillow

from io import StringIO  从io中导入StringIO

面向对象:

class Chain(object):
    def __init__(self, path=''):
        self._path = path
    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))
// REST API
print(Chain("user").document.pictures.name)
user/document/pictures/name

静态函数,类方法
@staticmethod   可以被继承和重写
def sayHello():

@classmethod
def sayHello(cls):  # 参数为类

枚举类

from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

@unique    # 保证值唯一
class Weekday(Enum):
    Sun = 0 # Sun的value被设定为0
    Mon = 1
    Tue = 2

访问: 
  Weekday.Tue
  Weekday['Tue']
  Weekday.Tue.value   枚举值
  Weekday(1) ==  Weekday.Mon
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b
    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

错误处理

可以跨越多层调用(只需要在外层使用try)
try:
      # something
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
     # ....

IO处理

# 文件操作一般用try catch 
open(path, rb)  # 打开文件  路径,模式
read()   # 读取所有内容  read(size)  readLine()  readLines()
write()
close    # 关闭

简化版: with   自动帮助关闭
with open(path, "r") as f:
    print(f.read)

StringIO: 在内存中读写str
BytesIO: 二进制数据

os: 目录或文件系统
os.name() uname()
os.mkdir() # 创建文件夹
os.rmdir() # 删除
os.path.join() # 拼接路径
os.rename(a,b)
os.remove()

序列化pickling: 内存 -> 可存储
反序列化unpickling: 可存储 -> 内存
使用pickle 模块

json: json模块
dumps(dict) # 序列化
loads(str)   # 反序列化

class -> json
class中定义转换的方法convert
dumps(clas1, default=convert)
json.loads(json_str, object_hook=dict2student)

常用内建模块

执行shell

import os
r = os.popen('pwd')
print(r.readlines())

多线程

def doSM():
    #
t = threading.Thread(target=doSM)
t.start() # 异步执行的
t.join()  # 如果想同步执行,调用join
上一篇 下一篇

猜你喜欢

热点阅读