python用三种方式定义字符串、并依次输出_Python 杂记

参考

函数和常用语法

raw_input 与 input

raw_input 只在 2 中存在,返回字符串,在 2 中,input 返回输入表达式的值;

3 中 input 返回字符串。

type

查看变量类型

交换两变量值1a, b = b, a

while/for else 语句

跟 if else 相同,在 while/for 条件为假时执行 else。所以,在未进入循环或循环正常完成后,else 部分会执行,而循环被 break 或出现异常,则不会执行 else。

1

2

3

4

5

6for value in ["Sat","Sun","Mon"]:

if value == "Sun":

print("Bingo!")

break

else:

print("No Sunday.")

yield 关键字

在函数中使用 yield 关键字让函数返回一个 生成器。 该生成器调用方式十分奇特,类似于断点调试,在调用其 next() 方法时运行到 yield 关键字处并返回参数,可多次调用直到函数结束(抛出 StopIteration 异常)。可以在函数中使用多个 yield,就像设置多个断点。隐含的一个特性是,每次只能取到下一个值,而不能回退取到上一个值。通常用 for/while 循环使用生成器,以代替循环调用 next(),

1

2

3

4

5

6

7

8

9

10

11def (stop):

print "step in"

for i in range(stop):

yield i

print "yield %g" % i

i += 1

g = gen(3) # 函数返回一个生成器

print "called gen" # 在调用 g.next() 方法前,gen 内代码不会执行

for i in g:

print i

sign 函数1sign = lambda a: 1 if a > 0 else -1 if a < 0 else 0

print 不换行

python2 中 print 不换行,python3 中使用参数 end=''1print("Hello World", end='')

dict 键列表

使用 list(dict) 获取 dict 的键列表

惯用处理

pip 更换仓库源1pip install numpy -i http://pypi.mirrors.ustc.edu.cn/simple/ # 临时用中科大源安装numpy

pip 下载安装包并离线安装1

2

3

4# 只下载包

pip download -d ./download_packs_dir -r ./requirements.txt

# 只安装

pip install --no-index --find-links=./download_packs_dir -r ./requirements.txt

从文件路径获取文件名与扩展名1

2

3

4import os

filepath = '/tmp/log.txt'

filename = os.path.basename(filepath) # 文件名

print(os.path.splitext(filename)) # 分离扩展名

时间

datetime 与 字符串相互转换1

2

3

4

5from datetime import datetime

id_s = "337259199211056344"[6:14] # 身份证号

d = datetime.strptime(id_s, '%Y%m%d')

print((datetime.now() - d).days) # 距今多少天,datetime相减得delta对象

print(d.strftime('%Y-%m-%d')) # datetime 格式化输出字符串

判断对象为数字1

2

3import numbers

x = 1

print(isinstance(x, numbers.Number))

读 excel 表1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16import xlrd

def read_excel(excel_name, sheet_name):

bk = xlrd.open_workbook(excel_name)

sh = bk.sheet_by_name(sheet_name)

nrows = sh.nrows #获取行数

ncols = sh.ncols #获取列数

print("excel %s, sheet %s, nrows %d, ncols %d" % (excel_name, sheet_name, nrows,ncols))

row_list = []

for i in range(0, nrows): #获取各行数据

row_data = sh.row_values(i)

row_list.append(row_data)

return row_list

生成随机数

random1

2

3

4import random

random.random() # 0 到 1 小数

random.randint(m,n) # m 到 n 整数

random.sample(list, n) # 从 list 不放回抽样 n 个,返回列表

正态随机

生成正态随机数列可用numpy.random.normal(mu, sigma, sample_num)

正则

匹配例子1

2

3import re

str = "截止日期:2016-7-11 2:44:29。余额:137533。逾期金额:28747。"

print(re.findall(r"余额:(.+?)。", str))

list 操作

range()1

2

3

4

5# range(stat=0,stop,step=1)

range(10) # 返回 0 到 9 列表

range(1,10) # 返回 1 到 9 列表

range(1,10,2) # 返回以 2 为步长 1 到 9 列表

range(0,-10,-1) # 返回 0 到 -9 列表

列表推导式1[x**2 for x in range(10)] # 创建一个新 list

切片

list 切片作为右值,会复制数据并返回引用。而对切片的修改会直接作用于原 list 上。1

2

3

4

5

6

7# list[start:stop:step], 用法类似 range,如果意义明确,可省略参数

# 索引可为负,可以超出范围

la = lb # 只能复制引用

la = lb[:] # 复制数据,返回引用给 la

lb[::-1] # lb 逆序列表 copy

lb[-2:-1] = [2, 4] # 将 lb 最后两个数赋为 2, 4

del lb[0:2] # 删除 lb 第 0、1 号元素

增加元素1

2

3

4list.append(x) # 追加到末尾

list.insert(i, x) # 插入到 i 处

la = lb + lc # 创建一个新 list,顺序加入 lb、lc 中元素

la.extend(lb) # 在 la 中依次添加 lb 中元素

判断元素存在1

2x in list # 返回 bool 类型,是否存在 x

list.count(x) # 返回 x 出现次数

按索引查元素

索引可为负,范围: [-len, len-1]

按元素查索引1list.index(x) # 第一次出现 x 位置,如果 x 不存在会报错

删除元素1

2

3

4del list[index] # 删除 index 处元素

list.remove(x) # 删除 x 元素,如果不存在会报错

list.pop(index=-1) # 返回并删除 index 处元素

# 直接用切片复制保留元素到新列表中,也是一种方法

反转1list.reverse()

zip 合并1

2zip(la,lb,lc) # “同索引元素”组成元组,构成列表,长度为输入最短列表的长度

[a + b for a,b in zip(la,lb)]

模块

一个模块是一个源文件,文件名即模块名。模块由 import 语句加载后,便可以访问其中定义的对象。

import 与 from import

当 python 解释器 import 一个模块时,会执行其中的代码。1

2import module # 加载 module,使用其中对象时应该用 module.obj

from module import obj # 加载 module,只能使用 obj 对象,不用加 module 前缀

__name__ 属性

当 python 解释器加载一个模块时,会设置每个模块的属性 __name__。 只有当前运行模块的该属性被设置为 __main__,所以可用以下语句判断当前模块是否是程序入口1

2if __name__ == "__main__":

pass

模块搜索路径1

2

3# sys.path 列表存储了模块搜索路径

import sys

sys.path # 可修改该列表以修改模块搜索路径

搜索路径初始包括:

运行脚本目录

环境变量 PYTHONPATH 中存储的值

Python 模块的安装目录

dir()1

2dir() # 返回当前模块定义的对象名列表

dir(module) # 返回 module 定义的对象名列表

模块安装

三种方式:

进入下载安装包目录,运行 setup.py 程序:1

2

3

4

5

6

7# 源码安装

cd download_dir

python setup.py install # 运行 setup.py 安装程序

# 用 pip 安装,自动安装依赖包

pip install PackageName

# 用 easy_install 安装,不推荐使用

easy_install PackageName

win下 Anaconda 安装依赖包

进入Anaconda安装目录1

2

3cd Scripts

pip install PackageName -i https://pypi.tuna.tsinghua.edu.cn/simple/

# -i 后接国内镜像地址url,提升速度

更换conda源(清华):1

2conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

conda config --set show_channel_urls yes

是一个包含 __init__.py 的文件夹,导入模块时需要加上包前缀,类似 Java。

作用域

三大作用域

只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等,甚至列表推导式也是)不会引入新的作用域

子级作用域与上级

在子级作用域可访问上级作用域变量。让上级变量指向另一个对象不能使用语句 same_name = obj, 该句被视为在子级作用域定义一个同名变量,并隐藏了上级变量。

1

2

3

4

5

6

7def run():

print("read y: %d" % y) # 读取全局变量

x = 1 # 创建一个局部变量 x

x, y = 0, 0

run()

print("global x: %d" % x)

global 与 nonlocal 语句

如果想在子级作用域中让上级作用域变量指向其他对象,可以用 global 与 nonlocal 语句。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18x, y = 0, 0

def outer():

# nonlocal x 这样声明会报错,python 不能找到非全局的上级变量 x

x, y = 1, 1

def inner():

nonlocal x

x = 2

global y

y = 2

inner()

print("outer:", x, y)

outer()

print("global:", x, y)

# 输出:

# outer: 2 1

# global: 0 2

global 最先出现,用于在局部引用全局变量,随后又加入 nonlocal,使子级作用域引用 非全局的 上级变量。

类变量与实例变量

类变量的定义与访问其中两种方式:

class_name.class_var

类定义内方法定义外 class_var

实例变量定义与访问有两种方式:

obj_name.obj_var

在有 self 参数的方法定义中 self.obj_var

用访问实例的方式可以访问类变量,就像 在子级作用域访问上级变量,只能访问而不能让其指向另一个对象,而且如果实例变量与类变量同名则访问实例变量。

1

2

3

4

5

6

7

8

9

10class cls:

v1 = 0 # 定义类变量

def __init__(self):

self.v1 = 1 # 定义实例变量,隐藏同名类变量

cls.v2 = 0 # 定义类变量

obj = cls()

print cls.v1, cls.v2 # 访问类变量

print obj.v1, obj.v2 # 分别访问实例变量 v1 与类变量 v2

字符串

模板

类似 C 语言的格式化字符串,用 % 号连接模板字符串(Template)与匹配元组。

1

2

3

4'%s is a string. %d is a int.' % ("Hello World", 0) # 该表达式返回一个字符串

# 也可将元组替换成字典,模板对应加入 (key)

"I'm %(name)s, and I love %(num)g." % {"num":math.pi, "name":"Mike"}

原生字符串(常量)

在字符串字面量前加 r ,会使之成为原生字符串字面量,不会对字符进行转义。

1r"n" == "\n" # 返回 True

加操作

字符串只允许与字符串进行加操作

函数参数

参数传递

函数形参(函数定义参数)复制了实参(传入函数的变量)的引用,类似 Java,对形参引用对象的修改实际上在修改实参引用对象,但让形参指向其他对象不会对实参有影响。

缺省与变长

函数参数的定义顺序与调用顺序应该遵循:关键字参数–>缺省参数–>变长参数–>关键字参变长数

关键字参数

最基本的一类参数,调用时可指明形参名(关键字)。与其他参数不同,必需赋值。1

2

3

4

5

6

7def fun(a, b):

print a, b

fun(1, 2) # 一般调用方法

fun(b=1, a=2) # 指明形参名可乱序

fun(1, b=2) # 可行

fun(1, a=2) # 这样调用出错

fun(a=1, 2) # 同样出错

缺省参数

缺省参数有缺省值。除了顺序在关键字参数后以及有缺省值外,与关键字参数基本相同。1

2

3def fun(a, b=2): # b 为缺省参数

print a, b

fun(1, 2)

变长参数

参数个数不定,形参最终得到元组,调用时可不传,一个个传递或传一个元组。1

2

3

4

5

6def fun(a, *b): # b 为变长参数

for i in b:

print a + i

fun(1, 2, 3)

fun(1, *(2, 3)) # 用元组传递变长参数,加星号,称作解包

fun(1) # 不传或解包空元组都可行

关键字变长参数

参数个数不定,而且必须指明关键字。形参最终得到字典,与变长参数类似,调用时可不传,一个个传递或传一个字典。1

2

3

4

5def fun(**kwargs):

for k, v in kwargs.items():

print "get " + k + "=" + str(v)

fun(a=1, s="hi")

fun(**{"a": 1, "s": "hi"}) # 字典解包,注意关键字必须为字符串

参数顺序1

2

3def fun(a, b=1, *c, **d): # 函数定义时形参须根据类型按序定义

pass

fun(1, 2, 3, d1=4) # 函数调用时也根据类型按序传入

常识

元组元素不能改变

False

判断语句中None,False,空字符串””,0,空列表[],空字典{},空元组()都相当于False

虚拟环境1

2

3

4

5

6sudo pip3 install virtualenv

# 创建虚拟环境,python3,无已安装包

virtualenv -p python3 --no-site-packages venv

source venv/bin/activate # 激活

pip freeze > requirement # pip freeze

deactivate # 退出虚拟环境

文件操作

当前目录1

2import os

os.getcwd()

简单文件读写1

2

3

4

5

6

7

8

9col = []

with open('file_path.csv', 'r') as df:

for line in df:

tmp = line.strip().split(',')

col.append(int(tmp[3])) # 读取第4列

with open('out_path', 'w') as df: # 'a' 追加

for val in col:

df.write("%dn" % val)

在控制台运行源文件1execfile('python_code.py')

错误及解决办法

pip安装出现SOCKS支持问题

报错Missing dependencies for SOCKS support。在Ubuntu下,用unset all_proxy && unset ALL_PROXY命令解除代理设置。

你可能感兴趣的:(并依次输出)