python学习总结(一)

来源:互联网 发布:angularjs repeat源码 编辑:程序博客网 时间:2024/05/18 03:02
  1. 1.file的操作:
    file(“d:\python\python.txt”,’w’,encoding=”utf8”)
    #这是打开输入流的代码,第二个参数默认是r,这里是读w,也 #可以用来在文章结尾追加a,如果是二进制就要加b,ba,bw,br。
    `#一个高级的操作
filepath="d:\python\pythonFileTest.txt"with open(filepath) as  file:    lines=file.readlines()    for line in lines:        print(line.rstrip())input("<enter>")#格式就是这样,不能有错,否则报错,其实就是规定要空格进行缩进来表示方法块,默认是一个tab健

2.#这是异常的写法

try:    print(5/0)except Exception:    print("------")input("<enter>")#ZeroDivisionError 是除数不能为0#FileNotFoundError 文件没有找到#异常的父类是BaseException

3.Python中函数的定义和js差不多:

#声明函数用defdef 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位置。

  1. 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。

  1. 导入别的类:
#使用import 关键字导入另一个方法所在的文件,比如test.pyimport test#使用test.py中的方法,要像java中静态方法调用一样即可test.test01()#也可以导入更多的函数或者是特定的函数#可以用form modelname import functionname导入#这样导入的效果是和java中静态导入一样,可以直接写方法名称进行调用from test import test02test02()如果导入特定的方法很多,可以用‘,’好隔开form test import test02,test03,teat04test02()test03()test04()
  1. 也可以用as给制定的方法,和类定制别名:
#给模块定制别名 import test as model#给方法定制别名from test import test02 as testall#导入带模块中所有的函数from test import *

显然,Python中模块就会一个文件,比类大

  1. 在模块中定义了类,如果想使用,需要导入该类。
    from modelname import classname
    如果类是多个的话,应该用逗号分隔。

这个导入和类中导入方法是一样的。

13.我都不知道这是啥

from collections import OrderedDictfavorite_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 datetimedt=datetime(2017,4,26,5,20)dt.timestamp()t=xxxdatetime.fromtimestamp(t)java表示到毫秒级别,Python精确到秒级,小数位是毫秒date=datetime.strptime('2015-6-1','%Y-%m-%d %H-%M-%S')字符串转化成datetimedata=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
  1. collections集合
from collections import namedtuplePoint=namedtuple('a',['a','b'])p=Point(1,2)print(p.a)print(p.b)做着给出的例子是做坐标来使,但,a的定义完全没有用,懵逼。from collections import dequeq = 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 Counterc = Counter()for ch in 'programming':c[ch] = c[ch] + 1计数器,个人暂时感觉没有啥子卵用
  1. DOM vs SAX

操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

<a href="/">python</a>start_element事件,在读取<a href="/">时;char_data事件,在读取python时;end_element事件,在读取</a>时。

16.

from html.parser import HTMLParserfrom html.entities import name2codepointclass MyHTMLParser(HTMLParser):    def handle_starttag(self, tag, attrs):        print('<%s>' % tag)    def handle_endtag(self, tag):        print('</%s>' % tag)    def handle_startendtag(self, tag, attrs):        print('<%s/>' % tag)    def handle_data(self, data):        print(data)    def handle_comment(self, data):        print('<!--', data, '-->')    def handle_entityref(self, name):        print('&%s;' % name)    def handle_charref(self, name):        print('&#%s;' % name)parser = MyHTMLParser()parser.feed('''<html><head></head><body><!-- test html parser -->    <p>Some <a href=\"#\">html</a> HTML&nbsp;tutorial...<br>END</p></body></html>''')

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@decodef 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) andos.path.splitext(x)[1]=='.py']

这里写代码片
“`

原创粉丝点击