python学习总结(一)

  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("")
#格式就是这样,不能有错,否则报错,其实就是规定要空格进行缩进来表示方法块,默认是一个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位置。

  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.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()
  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 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
  1. collections集合
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
计数器,个人暂时感觉没有啥子卵用
  1. DOM vs SAX

操作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']

这里写代码片
“`

你可能感兴趣的:(python)