Python语法

*** 环境

安装: 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 Student(object): # object 继承自基类
  • def init(self, para1, para2): # 构造函数
  • __ 开头的属性是private, # 可以通过"类名_属性名"访问(不建议)
  • 重写不需要其他标志符
  • 实例可以绑定任意多的方法、属性。方法只在当前有效,全局有限可使用Student.func1 = func1
  • @property 修饰属性,不写set时表示只读
  • 支持多重继承MixIn
  • __slots__ = ('name', 'age') # 允许的属性名,对子类无效
  • __len__() #让该类能作用于len()函数
  • __str__() # 控制打印的内容 __repr__()供调试的打印, 可以__str__()和__repr__()
  • __getitem__() a[4], 通过下标取数据,需要考虑传入的是切片
  • __iter__ 迭代,需要实现next(), StopIteration表示结束
  • __next__() 返回下一个元素
  • __getattr__ 调用不存在的属性
  • __call__() 实例调用的方法 s = Student() s()
  • __dict__() 所有属性
  • 定义函数时要加上self参数 def cry(self, time): 调用时可以忽略该参数
  • Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class 参数:名称,父类,方法绑定
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)

常用内建模块

  • collections
    • namedtuple

      创建一个自定义的tuple对象,可以用属性访问
      Point = namedtuple('Point', ['x', 'y'])
      p = Point(1, 2)
      p.x

    • deque

      高效实现插入和删除操作的双向列表,适合用于队列和栈
      appendleft() popleft()

    • defaultdict

      key不存在时,返回一个默认值
      dd = defaultdict(lambda: 'N/A')

    • OrderedDict

      有序的dict,按照插入的先后顺序

执行shell

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

多线程

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

推荐阅读更多精彩内容