一.文件
python的文件操作很像C语言,使用内置open函数,要在参数中传递操作模式,
f = open("story.txt",'w')
f.write('从前有座山')
f.close()
f = open("story.txt",'r')
story = f.read()
print (story)
f.close()
二.异常
和java的try cach finally,逻辑一样
try:
f = open("story.txt",'r')
except ZeroDivisionError as e:
print('except:', e)
except FileNotFoundError:
print('except:', '文件没找到')
finally:
print('finally')
可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句
三.线程与线程锁
1.如何开启一个新的子线程
写一个函数,类似java的run()
创建一条线程,传入任务
import threading
import time
def download(file):
n = 0
while n <= 100:
print(file,':下载进度',n,"%")
n = n + 10
time.sleep(0.5)
t1 = threading.Thread(target = download,args=('游戏',))
t2 = threading.Thread(target = download,args=('图片',)) //args参数最后还要加个逗号,以表示数组
t1.start()
t1.join()
t2.start()
start和join函数和java类似。
2.给线程加锁
通过threading.Lock()来实现创建一个锁
lock = threading.Lock()
def fun(a):
for i inrange(100000):
lock.acquire()
# 对原本线程不安全的数据做操作
lock.release()
四.
之前对比着java学习了python的最基础部分,现在要单独研究一下python中独有的高级特性。例如在与java对比的时候,介绍过,列表、元组、字典、集合,但是他们还有一些独有的特性没有详细介绍。
1.切片
python中有一种对列表的操作方法,叫切片,把一个列表切开,得到的结果还是一个列表。
l = ['aaa','bbb','ccc']
print(l[0:3]) #['aaa', 'bbb', 'ccc']
print(l[:3]) #['aaa', 'bbb', 'ccc'],0可以省略
print(l[-1]) #ccc,倒数第一个元素
print(l[-2:]) #['bbb', 'ccc'],从倒数第二个取到最后一个
print(l[0:3:2]) # ['aaa', 'ccc'],每跳两个取值
切片操作同样适用于tuple和字符串
2.列表生成式与生成器
列表生成式
用一个特殊的语法来创建列表,这样的语法很简短,第一次看的时候很懵逼。
l = [x*2 for x in range(1, 10)]
print(l)
f = [x + y for x in 'ABCDE' for y in '1234567'] #两个集合做笛卡尔积组合
print(f)
h = [x for x in range(1, 30) if (x%3==0)]
print(h)
列表生成器
虽然名字很像,但是和生成式并不是一样的概念。生成器是一个对象generator,用来代替列表被使用,这个对象接收一个列表生成的规则,然后在使用列表生成器的时候,并不是真的把所有数据存储在生成器中,而是动态计算列表中的元素。好处就是用时间换空间,如果一个列表要存储特别大量的数据,就适合用生成器来代替。
#在写法上看起来和生成式很像,只是把[]换成了()
l = (x*2 for x in range(1, 1000))
#print(l) # 报错,l是一个生成器,而不是列表。没有办法用这样的方法打印了
#print(l[2]) #报错,生成器不能直接使用索引
for n in l:
print(n)
yield
用yield来创建一个高级的列表生成器,yield可以把一个函数变成一个列表生成器,通过yield标识的值会成为列表中的一个元素
def fun(t):
a = 0
for i in range(t):
a+=i
yield a
a = fun(10) #a是一个列表生成器
for i in
print(i) # 0 1 3 6 10 15 21 28...
3.迭代
enumerate()
python的普通迭代for…in…操作是没有下标的,如果需要下标,要使用一个函数enumerate(),得到一个枚举,索引与值的组合。
l = ['aaa','bbb','ccc']
m = enumerate(l) #enumerate()函数入参是一个列表,返回值m是枚举类型
for index,value in m:
print(index,value)
Iterable与Iterator
下面区分两个概念,迭代器Iterator和可迭代对象Iterable。
在java中,Iterable是一个接口,实现这个接口的对象都能被用foreach迭代。
在java中,Iterator是一个接口,实现这个接口的对象都可以用next()操作。
在python中类似,可以用for in 操作的都是可迭代对象Iterable
集合数据类型,如list、tuple、dict、set、字符串,都可以用for来迭代,称为可迭代对象。上面介绍的生成器generator也是可迭代对象。
Iterator对象可以被next()函数调用并不断返回下一个数据。
列表生成器generator,既是Iterable又是Iterator。
了解了这些最基本的东西之后,其他的特性和使用方法就可以在实际开发中学习了