Python基础-高级Python函数和句法

李金的中文Python笔记[https://github.com/lijin-thu/notes-python]的学习笔记及摘要。

与操作系统进行交互:os 模块

import os

文件路径操作

  • os.remove(path)os.unlink(path) :删除指定路径的文件。路径可以是全名,也可以是当前工作目录下的路径。
  • os.removedirs:删除文件,并删除中间路径中的空文件夹
  • os.chdir(path):将当前工作目录改变为指定的路径
  • os.getcwd():返回当前的工作目录
  • os.curdir:表示当前目录的符号
  • os.rename(old, new):重命名文件
  • os.renames(old, new):重命名文件,如果中间路径的文件夹不存在,则创建文件夹
  • os.listdir(path):返回给定目录下的所有文件夹和文件名,不包括 '.''..' 以及子文件夹下的目录。('.''..' 分别指当前目录和父目录)
  • os.mkdir(name):产生新文件夹
  • os.makedirs(name):产生新文件夹,如果中间路径的文件夹不存在,则创建文件夹

os.path 模块

不同的操作系统使用不同的路径规范,这样当我们在不同的操作系统下进行操作时,可能会带来一定的麻烦,而 os.path 模块则帮我们解决了这个问题。

import os.path

测试

  • os.path.isfile(path) :检测一个路径是否为普通文件
  • os.path.isdir(path):检测一个路径是否为文件夹
  • os.path.exists(path):检测路径是否存在
  • os.path.isabs(path):检测路径是否为绝对路径

split 和 join

  • os.path.split(path):拆分一个路径为 (head, tail) 两部分
  • os.path.join(a, *p):使用系统的路径分隔符,将各个部分合成一个路径

其他

  • os.path.abspath():返回路径的绝对路径
  • os.path.dirname(path):返回路径中的文件夹部分
  • os.path.basename(path):返回路径中的文件部分
  • os.path.splitext(path):将路径与扩展名分开
  • os.path.expanduser(path):展开 '~''~user'

CSV 文件和 csv 模块

import csv

读 csv 文件

假设我们有这样的一个文件:

%%file data.csv
"alpha 1",  100, -1.443
"beat  3",   12, -0.0934
"gamma 3a", 192, -0.6621
"delta 2a",  15, -4.515
data = []

with open('data.csv') as fp:
    r = csv.reader(fp)
    for row in r:
        data.append([row[0], int(row[1]), float(row[2])])
    
data
>>>
[['alpha 1', 100, -1.443],
 ['beat  3', 12, -0.0934],
 ['gamma 3a', 192, -0.6621],
 ['delta 2a', 15, -4.515]]

写 csv 文件

data = [('one, \"real\" string', 1, 1.5), ('two', 2, 8.0)]
with open('out.psv', 'wb') as fp:
    w = csv.writer(fp, delimiter="|")  # 可以更换分隔符
    w.writerows(data)

!cat 'out.psv'
>>>
"one, ""real"" string"|1|1.5
two|2|8.0

其他选项

numpy.loadtxt()pandas.read_csv() 可以用来读写包含很多数值数据的 csv 文件。其中使用 pandas 进行处理,生成一个 DataFrame 对象:

import pandas
df = pandas.read_csv('trades.csv', index_col=0)
print df

正则表达式和 re 模块

import re

re.match & re.search

re 模块中, re.matchre.search 是常用的两个方法:
re.match(pattern, string[, flags])
re.search(pattern, string[, flags])
两者都寻找第一个匹配成功的部分,成功则返回一个 match 对象,不成功则返回 None,不同之处在于 re.match 只匹配字符串的开头部分,而 re.search 匹配的则是整个字符串中的子串。

正则表达式规则

正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义:

子表达式匹配内容
.匹配除了换行符之外的内容
\w匹配所有字母和数字字符
\d匹配所有数字,相当于 [0-9]
\s匹配空白,相当于 [\t\n\t\f\v]
\W,\D,\S匹配对应小写字母形式的补
[...]表示可以匹配的集合,支持范围表示如 a-z, 0-9
(...)表示作为一个整体进行匹配
¦表示逻辑或
^表示匹配后面的子表达式的补
*表示匹配前面的子表达式 0 次或更多次
+表示匹配前面的子表达式 1 次或更多次
?表示匹配前面的子表达式 0 次或 1 次
{m}表示匹配前面的子表达式 m 次
{m,}表示匹配前面的子表达式至少 m 次
{m,n}表示匹配前面的子表达式至少 m 次,至多 n 次

例如:

  • ca*t 匹配: ct, cat, caaaat, ...
  • ab\d|ac\d 匹配: ab1, ac9, ...
  • ([^a-q]bd) 匹配: rbd, 5bd, ...

datetime 模块

datetime 格式字符表

字符含义
%a星期英文缩写
%A星期英文
%w一星期的第几天,[0(sun),6]
%b月份英文缩写
%B月份英文
%d日期,[01,31]
%H小时,[00,23]
%I小时,[01,12]
%j一年的第几天,[001,366]
%m月份,[01,12]
%M分钟,[00,59]
%pAM 和 PM
%S秒钟,[00,61] (大概是有闰秒的存在)
%U一年中的第几个星期,星期日为第一天,[00,53]
%W一年中的第几个星期,星期一为第一天,[00,53]
%y没有世纪的年份
%Y完整的年份

SQL 数据库 05.06-sql-databases

待深入学习

对象关系映射

数据库中的记录可以与一个 Python 对象对应。

待深入学习

函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归

默认参数是可变的!????

匿名函数

为了方便,对一些简单的函数,我们通常使用匿名函数的方式进行处理,其基本形式是:lambda <variables>: <expression>

print(map(lambda x: x * x, range(5)))
>>>
[0, 1, 4, 9, 16]

map(f, sq) 函数将 f 作用到 sq 的每个元素上去,并返回结果组成的列表,相当于:

[f(s) for s in sq]

迭代器

有些情况下,我们既希望获得下标,也希望获得对应的值,那么可以将迭代器传给 enumerate 函数,这样每次迭代都会返回一组 (index, value) 组成的元组:

x = [2, 4, 6]

for i, n in enumerate(x):
    print 'pos', i, 'is', n
>>>
pos 0 is 2
pos 1 is 4
pos 2 is 6

字典对象的 iterkeys, itervalues, iteritems 方法返回的都是迭代器:

x = {'a':1, 'b':2, 'c':3}
i = x.iteritems()
print i
>>>
<dictionary-itemiterator object at 0x0000000003D51B88>

生成器

def generator(...):
    <do setup>
    while True:
        <generate value>
        # yield 说明这个函数可以返回多个值!
        yield value
        if <done>:
            break

生成器使用 yield 关键字将值输出,而迭代器则通过 nextreturn 将值返回;与迭代器不同的是,生成器会自动记录当前的状态,而迭代器则需要进行额外的操作来记录当前的状态。

对于之前的 collatz 猜想,简单循环的实现如下:

def collatz(n):
    sequence = []
    while n != 1:
        if n % 2 == 0:
            n /= 2
        else:
            n = 3*n + 1
        sequence.append(n)
    return sequence

for x in collatz(7):
    print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

迭代器的版本如下:

class Collatz(object):
    def __init__(self, start):
        self.value = start

    def __iter__(self):
        return self
    
    def next(self):
        if self.value == 1:
            raise StopIteration()
        elif self.value % 2 == 0:
            self.value = self.value/2
        else:
            self.value = 3*self.value + 1
        return self.value

for x in Collatz(7):
    print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
def collatz(n):
    while n != 1:
        if n % 2 == 0:
            n /= 2
        else:
            n = 3*n + 1
        yield n

for x in collatz(7):
    print(x)
>>>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

with 语句和上下文管理器

with open('my_file', 'w') as fp:
    # do stuff with fp
    data = fp.write("Hello world")

等效于下面的代码:

fp = open('my_file', 'w')
try:
    # do stuff with f
    data = fp.write("Hello world")
finally:
    fp.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值