Python学习笔记 - 基础语法

Python学习笔记 - 基础语法

  1. 多行输出:
print('''line1
line2
line3''')
  1. 空值:None
  2. 动态语言,不用定义变量之前确定类型
  3. /除法计算结果是浮点数,//地板除,两个整数的除法结果仍然是整数
  4. ()按小括号进行计算,计算结果自然是1。所以,只有1个元素的tuple定义时必须加一个逗号
  5. if语句不要忘了冒号,<条件判断1>是非零数值、非空字符串、非空list等,就判断为True,否则为False
if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
else:
    <执行3>
  1. int(s)是函数要和静态语言的强制类型转换区分(int)s
  2. 循环语句
for x in ..., while <条件>
  1. 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:
  2. 如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return
  3. 在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
  4. 参数,默认参数(n = 1),可变参数(args),关键字参数(**kw),命名关键字参数(,n)

    • 把nums这个list的所有元素作为可变参数传进去的写法:*nums
    • 和关键字参数*kw不同,命名关键字参数需要一个特殊分隔符后面的参数被视为命名关键字参数,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符了,命名关键字参数可以有缺省值
    • 参数组合,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
    • *args是可变参数,args接收的是一个tuple;
    • **kw是关键字参数,kw接收的是一个dict。
  5. 切片,L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。如果第一个索引是0,还可以省略:L[:3]

    • Python没有针对字符串的截取函数,只需要切片一个操作就可以完成
  6. 在Python中,迭代是通过for … in来完成的
    dict迭代,
for key in d
for value in d.values()
for k, v in d.items()
for i, value in enumerate(['A', 'B', 'C'])
for x, y in [(1, 1), (2, 4), (3, 9)]
  1. 列表生成器
[x * x for x in range(1, 11)]
  1. 生成器:generator,使用for循环,因为generator也是可迭代对象
g = (x * x for x in range(10))
for n in g
  1. 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
  2. 可以直接作用于for循环的对象统称为可迭代对象,可以使用isinstance()判断一个对象是否是Iterable可迭代对象
    • 可以被next()函数调用并不断返回下一个值的对象称为迭代器,可以使用isinstance()判断一个对象是否是Iterator对象
    • 把list、dict、str等Iterable变成Iterator可以使用iter()函数
  3. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
  4. reduce()把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
  5. filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
  6. sorted()函数就可以对list进行排序,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序例如:
sorted([36, 5, -12, 9, -21], key=abs)
  1. 匿名函数lambda x: x * x匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
  2. 装饰器,我们要借助Python的@语法,把decorator置于函数的定义处,Python内置的functools.wraps,把原始函数的name等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错
  3. functools.partial就是帮助我们创建一个偏函数的,例如:
int2 = functools.partial(int, base=2)
  1. 每一个包目录下面都会有一个init.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为init.py本身就是一个模块,而它的模块名就是mycompany
  2. 在Python中,定义类是通过class关键字,class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的
    • 定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的
  3. 和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同
  4. 在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量
  5. 判断一个变量是否是某个类型可以用isinstance()判断
  6. 在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类
  7. 判断对象类型,使用type()函数
  8. 判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:
isinstance([1, 2, 3], (list, tuple))
  1. 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态
  2. 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的同名属性
  3. 给实例绑定一个方法
from types import MethodType
s.set_age = MethodType(set_age, s)
  1. 给class绑定方法Student.set_score = set_score
  2. 定义一个特殊的slots变量,来限制该class实例能添加的属性,例如:
__slots__ = ('name', 'age')
  • 使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

    1. Python内置的@property装饰器就是负责把一个方法变成属性调用的:把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值
    2. 多重继承,一个子类就可以同时获得多个父类的所有功能
    3. 枚举值,value属性则是自动赋给成员的int常量,默认从1开始计数
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
  1. type()
  2. 错误处理,Python所有的错误都是从BaseException类派生的,通过raise语句抛出去
try:
    print('try...')
    r = 10 / int('2')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
    print('finally...')
print('END')
  1. 文本文件读写
try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()
with open('/path/to/file', 'r') as f:
    print(f.read())
  1. 二进制文件
f = open('/Users/michael/test.jpg', 'rb')
f.read()
  1. 写文件
with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

以’w’模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾怎么办?可以传入’a’以追加(append)模式写入。
47. 操作文件和目录

# 查看当前目录的绝对路径:
os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
os.rmdir('/Users/michael/testdir')

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

  1. Python提供了pickle模块来实现序列化和反序列化
#序列化
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()

#反序列化
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

  1. Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON
#序列化
import json
d = dict(name='Bob', age=20, score=88)
json.dumps(d)

#反序列化
import json
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str)
  1. datetime
from datetime import datetime, timedelta
#获取当前日期和时间
now = datetime.now()
#获取指定日期和时间
dt = datetime(2015, 4, 19, 12, 20)
#datetime转换为timestamp
dt.timestamp()
#timestamp转换为datetime
t = 1429417200.0
print(datetime.fromtimestamp(t))
#str转换为datetime
cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
#datetime转换为str
now.strftime('%a, %b %d %H:%M')
#datetime加减
now + timedelta(days=2, hours=12)

注意Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
51. collections
* namedtuple

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
  • deque
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
  • defaultdict
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
'abc'
dd['key2'] # key2不存在,返回默认值
'N/A'
  • OrderedDict

    使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict:

  • Counter

    Counter是一个简单的计数器

    1. base64

    Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据

import base64
base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'

base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
base64.urlsafe_b64decode('abcd--__')
b'i\xb7\x1d\xfb\xef\xff'
  1. hashlib
import hashlib
#MD5
md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())

#SHA1
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in '.encode('utf-8'))
sha1.update('python hashlib?'.encode('utf-8'))
print(sha1.hexdigest())
  1. Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数
  2. urllib
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')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值