filepath="d:\python\pythonFileTest.txt"
with open(filepath) as file:
lines=file.readlines()
for line in lines:
print(line.rstrip())
input("" )
#格式就是这样,不能有错,否则报错,其实就是规定要空格进行缩进来表示方法块,默认是一个tab健
2.#这是异常的写法
try:
print(5/0)
except Exception:
print("------")
input("" )
#ZeroDivisionError 是除数不能为0
#FileNotFoundError 文件没有找到
#异常的父类是BaseException
3.Python中函数的定义和js差不多:
#声明函数用def
def a(b):
#函数体
print(b)
b="a.txt"
a(b)
python中可以用break,这个和java中一样的
但是,在try-except中,如果发生错误,却不报错,这个其实好办吧,什么都不写也行,或者写pass
我测试过才发现,except中不可以什么都不写。那么。。。
4.方法
#title(),字符串第一个字符大写
#在函数调用汇总,可以设置默认值,如果无惨传递过来,那么就用默认值,如果有的话,就用有效值。
#a(b="dog")
#如果调用a方法,能用a("pig")
#trans
5.突然觉得Python有何就是有点像,因为在Python中可以直接写:return value,然后外部直接接受即可。
def func(username):
return username+" is a good boy"
message=func("tom")
#结果是Tom is a good boy
6.判断字符串是否为空可以:
message==None
或者是
message is None
7.append()和extend()
# append() 追加元素到到文章尾部,但是追加元素无论是什么类型,都作为一个元素处理。
#extend() 追加元素到文章尾部,但如果是列表,会把列表拆开,单个单个的添加
#insert(index,str)是吧制定str添加到制定的index位置。
list[:]和copy()
如果操作本列表,会把列表的序列内容改变,但是如果操作列表副本则不会有这种问题。
list[:]和copy()一样,都是生成副本。副本和原始数据可以说是一个双胞胎。
9.
def func(*p):
for num in p:
print(num)
a=list(['a','b','c'])
func(a)
*p只能作为函数参数使用,且可以包括无限个参数,注意,必须把该参数放到最后def func(a,*p)
python中参数有*p和**p,*p是一个tuple,而**p代表的是一个dict。
#使用import 关键字导入另一个方法所在的文件,比如test.py
import test
#使用test.py中的方法,要像java中静态方法调用一样即可
test.test01()
#也可以导入更多的函数或者是特定的函数
#可以用form modelname import functionname导入
#这样导入的效果是和java中静态导入一样,可以直接写方法名称进行调用
from test import test02
test02()
如果导入特定的方法很多,可以用‘,’好隔开
form test import test02,test03,teat04
test02()
test03()
test04()
#给模块定制别名
import test as model
#给方法定制别名
from test import test02 as testall
#导入带模块中所有的函数
from test import *
显然,Python中模块就会一个文件,比类大
这个导入和类中导入方法是一样的。
13.我都不知道这是啥
from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for name, language in favorite_languages.items():
print(name.title() + "'s favorite language is " +
language.title() + ".")
13.
datetime和timestamp:
import datetime import datetime
dt=datetime(2017,4,26,5,20)
dt.timestamp()
t=xxx
datetime.fromtimestamp(t)
java表示到毫秒级别,Python精确到秒级,小数位是毫秒
date=datetime.strptime('2015-6-1','%Y-%m-%d %H-%M-%S')
字符串转化成datetime
data=datetime.now()
strdata=data.strftime('%a, %b %d %H:%M')
Mon, May 05 16:28
时间的加减操作:
now=datetime.now()
now+datetime(days=2,hours=22)
#当前天往后2天22个小时
如果有别的需要导入:
from datetime import datetime, timedelta, timezone
from collections import namedtuple
Point=namedtuple('a',['a','b'])
p=Point(1,2)
print(p.a)
print(p.b)
做着给出的例子是做坐标来使,但,a的定义完全没有用,懵逼。
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
相对list,增加了插入和删除的效率
而appendleft(),popleft()则是在开始不为增加删除
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
怎么输入怎么输出,和hashtable类似
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
计数器,个人暂时感觉没有啥子卵用
操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。
<a href="/">pythona>
start_element事件,在读取<a href="/">时;
char_data事件,在读取python时;
end_element事件,在读取a>时。
16.
from html.parser import HTMLParser
from html.entities import name2codepoint
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print('<%s>' % tag)
def handle_endtag(self, tag):
print('' % tag)
def handle_startendtag(self, tag, attrs):
print('<%s/>' % tag)
def handle_data(self, data):
print(data)
def handle_comment(self, data):
print('')
def handle_entityref(self, name):
print('&%s;' % name)
def handle_charref(self, name):
print('%s;' % name)
parser = MyHTMLParser()
parser.feed('''
Some html HTML tutorial...
END
''')
16.
chr(66)数字换成对应的字符
ord(’a’)转化成对应的字符
编码
'中国'.encode('utf8')
b'\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf8')
声明编码
# -*- coding:utf-8 -*-
python3默认使用unicode编码
17.subprocess管理进程
进程文本控制,child是子进程变量
#标准输入流 child.stdin
#标准输出流 child.stdout
#标准错误流 child.stderr
主进程和子进程互不影响时,可以用wait()方法暂停
subprocess.Popen([“”,”“],stdi,stdout=subprocn=subprocess.PIPEess.PIPE,stderr=subprocess.PIPE)
命令用列表包含,这样也好用变量替换
18.
for循环中:
for i in a:
a必须是可迭代的,就是说如想实现迭代,需要思考清楚在决定。
其实就是说,这种格式应该是和for}(int a:list){}的思想一样
python对类型的定义随意,因为是动态类型的语言,但是在对于数据类型之间的操作支持的不是很好
比如,int类型和str类型之间,python不支持int隐式转化为str
19.
不变类型的数据结构的本身是不可能改变的,如果你测试改变了,只能说他创建了新的内容,和原来的是俩码事。
在try except中,用到了pass,其实pass的范围很广,只要是不想写内容都可以写pass。
比如:
def func():
pass
if age>18:
pass
等等
20.
isinstance(x,(int,str))检测x的类型的,如果是int,或者是str类型的,那么返回True,如果不是,返回False
前几天替别人搞了一个python返回多个值的例子,觉着不可思议,其实就是反悔了一个一个值,而这个值是元祖,
返回的数据都在改元祖中存放着。
python中的类型是真多啊,出了基本的,今天搞了一个Iterable,是个迭代类型。
21.
传参过程中,*p表示可以传入多个参数进去,并且把这些数据分装到p中。
而在形式参数中间搞一个,则是说后边的参数为固定的,如果有默认值,则不能给其传递参数,如果没有默认值,
参数个数固定,超过了就报错。这样是命名关键字参数。
**p是关键字参数,传入的参数类型是字典类型的。
22.
递归在在别的语言中是不建议用的,因为占用内存大,不小心会造成内存溢出的问题。
python中使用递归可以用尾递归,就是指return 本身。把东西用作参数传递。
def function(n,num=1):
if n<=1:
return 1,num
num = n*num
return function(n-1,num)
a=function(5)
print(a[1])
23.
python中引入了一个新的概念,就是切片,数据变量名称[开始index:结束index]
这里的index可正可父,但是一定是全正,或者是全负。
24.
构建索引,元素 对
for a,b in enumerate(range(5)):
print(a,b)
a是索引,b是元素
输出的结果是:
0 0
1 1
2 2
3 3
4 4
但其实作为索引的字符是可以改变的:
for a,b in [(5,”5”),(9,”8”),(11,”a”)]:
print(a,b)
25.
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']
写法比较简单,解释一下,先循环range(),然后通过条件搞出符合的,进行迭代,最后做x*x运算,放到列表[]中
.
26.
对字典进行迭代:
L={'a','a','b':'d'}
for i,j in L.items():
print(i,j)
[s.lower() for s in L]
27.
好几个东西搞的懵逼了。
概念:生成器是generator,是一遍做循环,一遍做计算的。
例子是:
L=[x*x for x in range(5)]
G=(x*x for x in range(5))
l是list,而g是生成器,list,可以是直接展示。
而g需要用next(g)才能取到值,因为他返回的是内存地址。
而后一个数是前俩个数相加得到的斐波那契数和生成器类似。
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
我们也可以使用isgeneratorfunction(fab)来确定是否是genetator生成器。
下一个迭代器,iterator.生成器一定是迭代器,而且,iterable和iterator也有区别。查过资料的到结论:
iterable是可迭代的,可以用for循环的都是可迭代的。iterator是迭代器,能用next()函数的都是迭代器。
有可迭代到迭代器,用iter()函数即可实现。实际上迭代器就是可迭代的,因为for循环就是调用next()函数。
28.
话说一个高阶魔法,额。。不,是高阶函数,这个名字起得,吊炸天。
来,高阶魔法心法,map(function(), iterable)函数,原理是function()函数作用于iterable的每个元素上,然后返回一个可迭代的数据结构。
第二个高阶魔法,reduce().参数传入和map一样,原理是一直作用于俩个参数,显示第一和第二,第一和第二完成之后会合成一个数,在和第三个
作用出第四个数来,日此类推。
第三个高阶函数filter(),参数传入和map()一样,但是根据传入函数的返回值True决定是否舍去这个元素。
第四个高阶函数,sorted(),可以传入3个参数,第一个是可迭代的,第二个,自定义比较规则,第三个是否需要反向比较:
sorted([],key=abs,reverse=True),key还可以是str.lower,这个没有细研究,知道就行。
第五个高阶函数,延迟加载,也叫做闭包,就是不立刻执行,当调用的时候才执行。这种是返回值是函数的时候才可以进行闭包,而且,需要
注意的是,不要在闭包中写参数可变之类的,因为延迟加载,可能导致结果不一样。
第六个高阶函数,匿名函数,不常用,不看
29.函数名称可以作为对象来赋值:
def func():
print(“123”)
func() #输出123
func #输出地址
a=func
a() #输出123
30.
调用和使用的关系,自己总结的暗坑:
def func():
print(“2017-08”)
func() 可以直接调用函数
func 拿到的是函数内存地址
a=func
a() 是调用func()函数
如果写成:
f=func()
f
啥也得不到,因为func()没有返回值。
31.
正常的函数:
def func():
return 2;
a=func() 得到是2
返回函数:
def func1(funx2):
def func2():
return 2
return 3
f=func1()
f()这样才能调用func1()执行
f2=func1()
f2()构建出的是新函数
32.
装饰器挺重要,但目前没有弄懂,现在总结下偏函数。
这个和数学中的偏函数不一样,先搞个例子:
import functools
int2 = functools.partial(int,base=2)
int2(‘0100111’)
这个例子原理是:
int()函数本身,就可以容纳俩个参数,第一个是要变化的数值,第二个是当前数值的进制,然后转换成10进制。而偏函数就是新高出一个函数,把某些参数给定了默认值,所以,如果定义了上边代码,以后int2()就是转换2进制函数了。
但是,我们说python函数可以提供参数默认值,而默认值是在没有值的情况下生效的,如果有值,那么就使用参数值了。
int2(‘111’,base=10) #得7
33.
sys模块中有一个argv的变量,用list存储了命令行的所有参数。argv至少有一个元素,就是该文件的文件.py名称,比如这个文件是hello.py,那么第一个参数就是hello.py
查看所有内置模块
import sys
sys.path
暂时修改pythonpath:
sys.path.append(‘xxx’)
34.
着重研究下装饰器。
网上看到例子,说内裤本身作用遮羞,但是冬天不能御寒,于是长裤出现。这里内裤遮羞是原本函数的作用,冬天御寒是新的需求,长裤是解决办法,就是装饰器。
应用场景,这个常用语切面编程,那么日志,缓存和限权都可以做了。
现在是无参的。
搞了2中,具体的不太理解。
def deco(func):
func()
return func
@deco
def func():
print("---111---")
def deco(func):
def wrap():
func()
return func
return wrap
@deco
def func():
print("----222-----")
35.
对内存的读写:
字符是StringIO,二进制是BytesIO.
f = StringIO()
f.write(“”)
f.getvalue()
fi = StringIO(“—-xxx—-“)
36.
os模块
os.name nt是win,posix是linux
os.uname()是linux调用内核信息,linux 命令:uname -a
os.environ() 查看系统环境配置
os.environ.get(‘JAVA_HOME’) 获取键值对的
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
os.path.split('d://aaa/aaa.txt')
os.path.splitext('d://aaa/aaa.txt')
os.rename('d://aa.txt','b.txt')
os.rename('a.txt','b.txt')
os.remove('test.txt')
上边俩个都是在当前目录下有该文件的时候,在当前目录
shutil 模块提供了 copyfile()的函数,你还可以在 shutil 模块
中找到很多实用函数,它们可以看做是 os 模块的补充。
[x for x in os.listdir('.') if os.path.isdir(x)]
[x for x in os.listdir('.') if os.path.isfile(x) and
os.path.splitext(x)[1]=='.py']
这里写代码片
“`