python 程序技巧
- 超过1000次的循环,不要使用for循环
- 读取数据,计算数据,绘制数据,要分开进行
- 要及时保存处理过程中的中间变量,将处理好的中间变量保存到磁盘,在下一阶段直接读取,会比重新跑程序快很多
ch00 python3的安装
python3 是未来的主流。python2即将停止支持,所以应当尽量使用python3。
sudo apt-get install python3-pip
然后即可使用pip3命令进行安装相关的包
推荐使用pip3安装python所依赖的包,因为这样可以避免使用root权限,又可以保证包的 都是最新的。
.py文件和.pyw的区别在于,运行.pyw调用pythonw.exe文件不会出现任何控制台窗口,也不会有任何打印 输出,所有向原有的 stdout 和 stderr 的输出都无效,所有从原有的 stdin 的读取都只会得到 EOF
值得一提的是,开发纯图形界面程序的时候,你可以暂时把 .pyw 改成 .py,以便运行时能调出控制台窗口 ,看到所有错误信息,方便除虫。
ch01
变量名
3 条规则:
- 只能是一个词。
- 只能包含字母、数字和下划线。
- 不能以数字开头。
变量名是区分大小写的。小写字母开头
注释
# This program says hello and asks for my name.
print()函数
print('Hello world') # 打印字符串
print() # 打印空行
input() 等待用户输入
myName = input()
len()函数 计算字符串中字符的个数
str()、 int()和 float()函数 数据类型转换
ch02 控制流
2.1 布尔值/ 比较操作符 / 布尔操作符
但“布尔” 数据类型只有两种值: True 和 False。
== # 等于
!= # 不等于
< # 小于
> # 大于
<= # 小于等于
>= # 大于等于
布尔操作符 and or not
2.7 控制流语句
if / else elif
if [condition]:
# do sth
elif [condition]:
# do sth
else:
# do sth
while / break continue
for / range()
for i in range(5): # 0,1,2,3,4
print(str(i))
for i in range(12,16): # 12,13,14,15
print(str(i))
for i in range(0,10,2): # 0,2,4,6,8
print(str(i))
2.8 导入模块
import 语句包含以下部分:
import random #
import random, math # 可选的更多模块名称,之间用逗号隔开。
from random import * # 调用 random模块中的函数时不需要 random.前缀
使用完整的名称会让代码更可读, 所以最好是使用普通形式的 import 语句。
sys.exit()提前结束程序
import sys
sys.exit()
ch03 函数
定义函数
def func():
print('Func')
函数返回值
python 的函数参数默认均是形参,并不会被改变。python编程倾向于,输入和输出分开。
局部和全局作用域
在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函 数之外赋值的变量,属于“全局作用域”。
一个函数被调用时, 就创建了一个局部作用域。在这个函数内赋值的所有变量, 存在于该局部作用域内。该函数返回时,这个局部作用域就被销毁了, 这些变量就 丢失了。下次调用这个函数, 局部变量不会记得该函数上次被调用时它们保存的值。 作用域很重要, 理由如下:
- 全局作用域中的代码不能使用任何局部变量;
- 但是,局部作用域可以访问全局变量;
- 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量。
- 如果在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个 名为 spam 的局部变量,和一个名为 spam 的全局变量
依赖全局变量就是一个坏习惯。
如果需要在一个函数内修改全局变量, 就使用 global 语句。
def spam():
global eggs
eggs = 'spam'
eggs = 'global' # 全局变量
spam()
print(eggs)
在一个函数中, 一个变量要么总是全局变量, 要么总是局部变量。
如何引用文件中的函数
如果程序只有一个文件,那么就基本上所有的变量都是全局变量。如果在这个文件中定义函数,极有可能会导致全局变量会被引入到函数中, 这样的函数会有错误,所以最好把函数放到单独的文件中,然后引入到主文件当中
文件fun1.py
的内容
def func(a):
a=100+100;
return a+10;
文件main.py
的内容
import fun1 # 引入fun1.py的内容
a=100
a= fun1.func(a)
print(a)
异常处理
错误可以由 try 和 except 语句来处理。那些可能出错的语句被放在 try 子句中。 如果错误发生,程序执行就转到接下来的 except 子句开始处。
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
ch04 列表(list)与元组(tuple)
4.1 列表数据类型
list = [1,2,3,4,5]
list = ['cat', 'bat', 'rat', 'elephant']
list = ['hello', 3.1415, True, None, 42]
# 列表用左方括号开始, 右方括号结束,即[]。列表中的值也称为“表项”。表项用逗号分隔
用下标取得列表中的单个值。表后面方括号内的整数被称为“下标”。列表中第一个值的下 标是 0,
list = ['cat', 'bat', 'rat', 'elephant']
list[0] # cat
list[1000] # IndexError
list[1.1] # TypeError
list[-1] # 负数下标,列表的倒数第一个元素 elephant
list[0:4] # 切片下标, list[0], list[1],list[2], list[3]
list[1:3] # 切片下标, list[1], list[2]
lem(list) # 获取列表长度,4
list[1]="dog" # 用下标改变列表中的值
del(list[1]) # 删除列表中的值
[1, 2, 3] + ['A', 'B', 'C'] # 列表连接
list方法
-
list.index()
可以传入一个值, 如果该值存在于列表中, 就返回它的下标。
spam = ['hello', 'hi', 'howdy', 'heyas'] spam.index('hello') # 0
-
list.append()
将参数添加到列表末尾
-
list.insert(index, obj)
insert()方法可以在列表任意下标处插入一个值。 insert()方法的第一个参数是新值 的下标, 第二个参数是要插入的新值。
spam = ['hello', 'hi', 'howdy', 'heyas'] spam.insert(1,'hello') # 0
-
list.remove()
- 给 remove()方法传入一个值,它将从被调用的列表中删除。
- 试图删除列表中不存在的值, 将导致 ValueError 错误。
- 如果该值在列表中出现多次, 只有第一次出现的值会被删除。
-
list.sort(cmp=None, key=None, reverse=False)
- 数值的列表或字符串的列表, 能用 sort()方法排序
- 指定 reverse 关键字参数为 True, 让 sort()按逆序排序
- 不能对既有数字又有字符串值的列表排序, 出现TypeError错误
- sort()方法对字符串排序时, 使用“ASCII 字符顺序”, 而不是实际的字典顺序。这意味着大写字母排在小写字母之前。因此在排序时, 小写的 a 在大写的Z之后
- 如果需要按照普通的字典顺序来排序, 就在 sort()方法调用时, 将关键字参数 key 设置为 str.lower。
-
list.reverse()
-
list.count()
ch 元组
Python的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
ch05 字典和结构化数据
ch06 字符串操作
str.split() #清除默认 空格和tab 对空格数量不敏感 、
str.split(' ') #只清除一个空格 对空格数量敏感
str.contains('字符串')
str.split()
>>> str=" AS G01 2018 03 11 00 11 30.000000 1 -0.333992115743E-04 "
>>> str
' AS G01 2018 03 11 00 11 30.000000 1 -0.333992115743E-04 '
>>> str.split()
['AS', 'G01', '2018', '03', '11', '00', '11', '30.000000', '1', '-0.333992115743E-04']
>>> str.split(' ')
['', 'AS', 'G01', '', '2018', '03', '11', '00', '11', '30.000000', '', '1', '',
'', '-0.333992115743E-04', '', '', '', '']
如果是空格分割的字符串,直接用split()就可以了
ch07 模式匹配与正则表达式
ch08 读写文件
ch09 组织文件
ch10 调试
ch11 绘图
图例
在plot()中添加label,然后指定显示图例legend()
from matplotlib import pyplot as plt
# 主要x 和y的个数要相同,不然会报错
x = [5,6,7,8]
y = [7,3,8,3]
x1 = [2,5,3,9]
y1 = [5,3,2,7]
# 可以设置颜色,g代表green, r代表red,y代表yellow,b代表blue,g代表black
# linewidth = 5,设置线条粗细
# label 设置线条名称
plt.plot(x, y,'b',linewidth=5,label='Line One')
plt.plot(x1, y1,'r',linewidth=8,label='Line Two')
# 给这个图,添加标题和XY轴名称,注意这地方不能输入中文,matplotlib应该
# 对中文支持不好,写中文,会显示乱码,方块字
plt.title('Epic Chart')
plt.ylabel('Y axis')
plt.xlabel('X axis')
# 显示图例
plt.legend()
plt.show()
版权声明:本文为CSDN博主「Anthony_tester」的原创文章,遵循 CC 4.0 BY-SA 版权协 议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/u011541946/article/details/71552335
这里就跟R语言更加方便,Data和label的绑定更加自然方便,不需要特别指定,而且默 认生成的图例也很美观
python 执行scp
os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )