1.  
  2. 本节大纲:

  1. 一:双层装饰器:
    一个函数可以被多层装饰器进行装饰,函数渲染(编译)从下到上,函数执行从上到下。
    如下程序:
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. # author:liumeide
  4.  
  5. # USERINOF={'islogin':True}
  6. USERINOF={'user_type':'','islogin':True}
  7. def login(func):
  8. def inner_1(*args,**kwargs):
  9. if USERINOF.get('islogin',None):
  10. ret=func()
  11. return ret
  12. else:
  13. print('login first!')
  14. return inner_1
  15. def check_user(func):
  16. def inner(*args,**kwargs):
  17. if USERINOF.get('islogin',None)==True and USERINOF.get('user_type',None)=='':
  18. ret=func()
  19. return ret
  20. else:
  21. print('permission deny!!')
  22. return inner
  23. @login
  24. @check_user
  25. def index():
  26. print('index')
  27.  
  28. index()
  1.  多层装饰器该如何理解呢?

  1.  上面的函数的可以执行顺序可以理解为:
  1. 首先:函数logincheck_userindex加载到内存。在调用index函数的时候,执行index函数,因为index函数被check_user函数装饰,所以把check_user函数的内的inner函数体重新赋值给index,index函数体被当做
  1. 参数传入check_user函数。当满足inner函数的条件的时候被执行,新的函数index函数的函数体innerlogin函数的所装饰,也就是说inner函数被重新赋值给inner_1函数。也就是说最后调用执行index()顺序:
  1. 先执行inner_1函数体----->在执行inner函数体-->在执行index原先的函数体。
  1. 多层装饰器以此类推,同样的原理。三层以上的装饰器很少使用。
    二:字符串格式化:
    %[(name)][flags][width].[precision]typecode
    %号初始化字符串:
    顺序传入参数。
    执行名称传入参数
    保留小数点后几位
    当有占位符的时候 需要%%输出%如果没有占位符需要只写一个%在占位符的时候类似一个转义的意思。
    1
  1. print('name:%s,age:%s'%('evil',''))
  2.  
  3. name:evil,age:
  1. 普通字符串的初始化,需要传入的实参和占位符的个数保持一致。
  1. name):按名字进行取值。
  1.  2:可以根据占位的namekey,根据后面的字典对应的value进行传入来进行传入实参。
  1. print("Name:%(name)s"%{'name':'ok'})
  2. Name:ok
  1. 3 flags一般和width宽度来一起配合使用,如果单纯的使用flags并没什么效果。很少使用这个功能。
  1. print("qqqq%(name)+s"%{'name':'ok'})
  2. qqqqok
  1. 2个一起配合使用:+10表示右对齐,字符串ok占用10个字符。右对齐;正数前加正好,负数前加负号
  1. print("qqqq%(name)+10s"%{'name':'ok'})
  2. qqqq ok

-号表示左对齐。左对齐;正数前无符号,负数前加负号;

  1. 空格    右对齐;正数前加空格,负数前加负号;
  2.  
  3. 0        右对齐;正数前无符号,负数前加负号;用0填充空白处; 

 .precision   可选,小数点后保留的位数

但是没有居中的功能。

  1. print("qqqq%(name)-10sqqq"%{'name':'ok'})
  2. qqqqok qqq
  1.  
  1. print("%+10d" % )
  2. +
  1.  
  1.  
  1. print("%-10d" %)
  1.  
  1.  
  1. print("%04d" % )
  1.  
  1. print("%04d" % -)
  2. -
  1. print("% 4d" % )
  1. print("%.2f" % 1.225)
  2. 1.23
  1. typecode表示执行传入的字符串类型。有如下:

s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置

r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置

c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置

o,将整数转换成 八  进制表示,并将其格式化到指定位置

x,将整数转换成十六进制表示,并将其格式化到指定位置

d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置

e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)

E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)

f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)

F,同上

g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)

G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)

%,当字符串中存在格式化标志时,需要用 %%表示一个百分号

但是没有将整数转换成二进制功能。

  1. print('%%%d'%)
  2. %
  1. print('------%c-----%o-------%x'%(,,))
  2. ------A------------f
  1. format函数初始化字符串:
    [[fill]align][sign][#][0][width][,][.precision][type]
  1. print('adad{0}adadada{0}dada{1}'.format(,))
  2. adad1adadada1dada2
  1. print('adad{name}adadada{age}'.format(name='OK',age=))
  2. adadOKadadada22
  1. 居中功能并用a填充宽度为10. 
  1. print('adad{name:a^10s}adadada{age}'.format(name='OK',age=))
  2. adadaaaaOKaaaaadadada22
  1. 左对齐<
  1. print('adad{name:a<10s}adadada{age}'.format(name='OK',age=))
  2. adadOKaaaaaaaaadadada22

右对齐>

  1. print('adad{name:a>10s}adadada{age}'.format(name='OK',age=))
  2. adadaaaaaaaaOKadadada22
  1. 转化百分比
  1. print('this is {:%}'.format(0.2222))
  2. this is 22.220000%
  1. 支持整数转化二进制输出:
  1. print("---{0:d}----{0:b}---{0:o}--{1:%}".format(,0.2))
  2. ------------20.000000%
  1. 三:生成器和迭代器
    具有生成一定条件数据的能力的对象叫做生成器。
    具有取数据的能力叫做迭代器。
    在进行处理大数据的时候,用生成器会降低内存的消耗,每一次取值生成一次,在下次取值的时候,内存会回收该值,避免了浪费内存。
    其中filter函数和map函数返回的对象就是生成器。比如xrange函数返回的对象也是生成器。
  1. a=[,,,]
  2. f=filter(lambda a:a>,a)
  3.  
  4. for i in f:
  5. print(i)
  6. print(f)
  7.  
  8. <filter object at 0x004C5B50>
  1. 生成器本身由函数创造的,如何把普通的函数转成生成器呢?
    如果函数体内包含关键字yield 时这个函数就是生成器。
  1. def fun():
  2. print()
  3. yield 1
  4. fun()
  5. print(fun())
  6. <generator object fun at 0x00584780>

在调用函数的fun()时候并不执行函数。只有去取这个对象的时候进行生成。

  1. def fun():
  2. yield
  3. yield
  4. yield
  5. fun()
  6. for i in fun():
  7. print('__%s'%i)
  8. print(fun())
  9. __1
  10. __2
  11. __3
  12. <generator object fun at 0x004E4780>

当for循环执行时,执行函数体。第一次的时候,去函数func找yield 对应的值1 赋值给i输出,第二次从第一次的位置下一个的yield的值为2取值并赋值给i,直到取到所有的yield的结束循环。每一次取值生成对应的对象。

  1. 上面的函数fun是生成器而生成的结果fun()是迭代器,也就说对象具有可以被迭代,在迭代时候执行next方法取值,只能从前往后取值,
  2.  
  3. 练习:基于生成器生成range功能。
  1. def myrange(args):
  2. st=
  3. while True:
  4. if st >args:
  5. return
  6. yield st
  7. st+=
  8. ret=myrange()
  9. for i in ret:
  10. print(i)
  1. 四:函数递归。执行本身的函数体,当满足一定条件退出,并把最后执行的结果返回给上个函数,如果没有条件限制会无限执行下去。
  1. def fun(x):
  2. x+=
  3. if x>:
  4. return
  5. return fun(x)
  6. t=fun()
  7. print(t)

执行3次fun(x)函数。循环执行多次相同的函数体。

练习:实现累乘功能,比如输入3  实现3*2*1

  1. def fun(x):
  2. if x==:
  3. return
  4. return x*fun(x-)
  5. print(fun())
  1. 五:模块
    分类:内置模块、第三方模块、自定义模块。在python中叫模块其他语言叫类库。
    使用模块:先import 导入后使用。
    存在方式:.py文件。或者一个文件夹里有多个.py文件组成的一个模块。
    自定义模块导入:

目录之间用.表示

如果同一级不通模块导入相同的方法该如何区分呢???

1:通过相对路径来区分

aaarticlea/png;base64,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" alt="" />request模块调用上面的2个co模块。如果路径层级不多可以这么写 如果层级过多呢?调用次数过多呢?

  1. import lib.co
  2. import common.co
  3. common.co.login()
  4. lib.co.login()
  5. common OK
  6. lib OK

简单的方法 将导入的模块进行别名操作:

  1. from lib import co as f1
  2. from common import co as f2
  3. f1.login()
  4. f2.login()
  5. lib OK
  6. common OK

下面的方法是我们经常用的。

模块的意义:便于管理代码。不同的功能的代码进行归类。

模块导入的依据:

  1. import sys
  2. print(sys.path)
  3. C:\python2\day6
  4. C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\python35.zip
  5. C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\DLLs
  6. C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib
  7. C:\Users\Administrator\AppData\Local\Programs\Python\Python35-
  8. C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib\site-packages

sys.path是一个路径的列表。默认python 有限搜索当前py文件的目录依次搜索。所以当我们自定义模块时候可以有2种方式让python 找到我们定义的模块:

1:把自定义模块加入这个列表(append())

2:把自定义的模块加入上面的目录之中。

这样在导入模块的时候不会出现:ImportError: No module named 'xxx'

那怎么找出自己模块所在目录呢?

  1. import os
  2. print(os.path.abspath(__file__))
  3. print(os.path.dirname(os.path.abspath(__file__)))
  4. print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  5.  
  6. C:\python2\day6\s2.py
  7. C:\python2\day6
  8. C:\python2

根据自己需求将自己的变量导入sys.path即可。

模块的名称:不要和系统的内置模块的名字冲突。

第三方模块:1:pip进行安装

      2:源码进行安装。

安装第三方模块:requests

pip install requests

常用模块介绍:

json模块:

常用函数dums()、dum();loads()、load()

对于加s参数和不加s参数区别:

加s的是直接可以对python 的数据转换成json串(dums())或者直接将json串转换成python能识别的数据类型。而不加s的是将python的数据转换成json串并将json串写入文件中,或者将文件中的json串转换成python的基本数据。

  1. data=[,,,,(1,2,True)]
  2. obl=json.dumps(data)
  3. with open('data.txt','w') as f1:
  4. f1.write(obl)
  5. <class 'str'> [, , , , [, , true]]

如果需要写入需要操作文件才能写入。

  1. data=[,,,,(,,True)]
  2. obl=json.dumps(data)
  3. t_load=json.loads(obl,encoding='utf8')
  4. print(type(t_load),t_load)
  5. <class 'list'> [, , , , [1, 2, True]]

在将python基本数据类型进行json转换的时候,会将python的一些数据类型或者相应的值进行转换,比如上面的python的元组转换json时候变为列表。True变为 true。

转换表如下:

aaarticlea/png;base64,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" alt="" />

跨语言平台常用该模块。该模块可以将python的基本数据类型(列表、字典)转换成字符串----序列化。也可以将字符串形式的python 类型字符创转换成对应的数据类型(列表、字典)--反序列化。

  1. import json
  2. list_1=[,,,,]
  3. # json.dump(list_1,open('json.txt','w'))
  4. obj=json.load(open('json.txt','r'))
  5. print(obj)
  6. [, , , ]
  1. pickle模块:可以将非python数据类型的数据进行序列化和反序列化。存储方式是二进制。所以要以wb或者rb进行相关的dumsloads
  1. import pickle
  2. a='aa'
  3. pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))

pickle.dumps()将相应的数据类型转换成字节。如果不指定编码,python解释器会用默认编码进行处理。

  1. import pickle
  2. data=[,,,,(,,True)]
  3. t=pickle.dumps(data)
  4. print(t,type(t))
  5. b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x01K\x02\x88\x87q\x01e.' <class 'bytes'>
  1. import pickle
  2. a='aa'
  3. # pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))
  4. t=pickle.load(open('pickle.txt','rb'))
  5. s=str(t,encoding='utf-8')
  6. print(s)
  7. aa
  1. import pickle
  2. data=[,,,,(,,True)]
  3. t=pickle.dumps(data)
  4. t_load=pickle.loads(t)
  5. print(t_load,type(t_load))
  6. [, , , , (, , True)] <class 'list'>

在Django中会用到经常用到pickle模块。

requests模块:属于第三方模块需要进行手动安装(pip  install requests)

进入python安装目录:E:\python3.6\Scripts

运行:pip.exe install request

  1. import requests
  2. import json
  3. res=requests.get("http://wthrcdn.etouch.cn/weather_mini?city=北京")
  4. res.encoding='utf-8'
  5. print(type(res))
  6. dict_1=json.loads(res.text)
  7. print(dict_1)

time模块和datatime 模块

获取本地准确时间:

  1. 1 import time
  2. 2 print( time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))
  3. 3
  4. 4 2016-09-23 21:50:45

time模块:首先了解下

时间戳的概念:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

1:获取本地时间戳

  1. import time,datetime
  2. print(time.time())##获取本地的时间的时间戳。
  3. 1465714711.3878157

2:获取本地时间。

  1. import time,datetime
  2. print(time.ctime())
  3. Sun Jun ::

3:获取本地时间的时间struct_time格式。

  1. print(time.localtime())
  2. time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)

4:将时间戳转换成字符串时间

  1. import time,datetime
  2. print(time.ctime(time.time()))
  3. Sun Jun ::

5:将时间戳转成struct_time格式。time.mktime把struct_time格式的时间转换成时间戳。

  1. print(time.mktime(time.gmtime()))
  2. 1465687430.0

struct_time格式是元组,可以进行相关取值。

这种获取的struct_time格式是hour不是本地地时间的hour,查时区的8小时。也就是说time.time()格林威治时间戳。换成time.localtime()

  1. import time,datetime
  2. print(time.gmtime(time.time()))
  3. time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=7, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
  1. 1 print(time.localtime())
  2. time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)

5:将struct_time格式转换成指定字符串时间格式

  1. 1 import time,datetime
  2. 2 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))
  3. 3 2016-06-12 07:14:47

注意:也就是说首先需要获取时间戳然后转换成struct_time格式然后转换成你想要的时间格式。

可以把指定的时间格式字符串转换成struct_time格式然后在转换成时间戳。

  1. print(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S"))
  2. time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)
  1. print(time.mktime(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S")))
  2. 1465686887.0

datetime模块:

返回当前时间格式xx-xx-xx

  1. print(datetime.datetime.today())
  2. -- ::21.323805

可以用切割获取我们想要的格式:

  1. 1 TIME=datetime.datetime.today()
  2. 2 TIME_INT=str(TIME).split('.')[0]
  3. 3 print(TIME_INT)
  4. 4 2016-06-12 16:40:00

将时间戳转换成时间字符串

  1. print(datetime.datetime.fromtimestamp(time.time()))
  2. -- ::05.047899

输出当前时间:

  1. print(datetime.datetime.now())
  2. -- ::07.611796

也可以将时间格式的转换成字符换进行进行切割出大约的时间(因为毫秒去掉)

将时间戳转换成struct_time格式 如下输出不存在时区问题。

  1. TIME=datetime.datetime.now()
  2. print(TIME.timetuple())
  3. time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)

将字符串转化成日期格式。

  1. str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
  2. -- ::

时间的加减:

  1. new_date = datetime.datetime.now() + datetime.timedelta(days=10)##比现在时间加10天。
  2. print(new_date)
  3. 2016-06-22 17:29:11.435878
  1. new_date = datetime.datetime.now() + datetime.timedelta(days=-10)## 比现在减10天。
  2. print(new_date)
  3. 2016-06-02 17:30:33.124046
  1. new_date = datetime.datetime.now() + datetime.timedelta(hours=-10)#比现在减10小时。
  2. print(new_date)
  1. new_date = datetime.datetime.now() + datetime.timedelta(seconds=120)#比现在加120秒。
  2. print(new_date)
  3. 2016-06-12 17:36:07.311463

模块:logging

首先创建logging实例。然后创建handler,分两种 一种输出到文件中 Filehandler,一种输出到终端的Streamhandler.分别为这两种handler指定输出格式setformatter

然后将这2种handler添加(add)到logging实例中。该实例就有输出到文件和终端的日志信息的属性。

实际例子:

  1. import logging
  2. def logsystem(x):
  3. log=logging.getLogger("mylog")##定义一个logging的实例log
  4. log.setLevel(logging.INFO) #设置全局日志级别,如果handler的日志级别低于INFO,不会输出日志信息。
  5.  
  6. fl=logging.FileHandler(x,encoding='utf-8')##设置一个文件输出的Filehandler.可以指定输出文件的编码,写入方式默认a追加,可以指定。
  7. fl.setLevel(logging.ERROR)#设置输出级别ERROR
  8.  
  9. con=logging.StreamHandler()#设置终端Streamhandler.
  10. con.setLevel(logging.INFO)#设置输出日志信息级别。
  11.  
  12. Formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))#设置输出日志格式。主要asctime是输出时间。name是上面logging实例名字"mylog"message是在调用的时候输入的日志信息。
  13. fl.setFormatter(Formate)#分别给各个handler设置日志格式。
  14. con.setFormatter(Formate)
  15.  
  16. log.addHandler(fl)#给logging实例log添加handler属性。
  17. log.addHandler(con)
  18. return log#该函数的返回值是logging实例。

1: logging.getLogger([name])

返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和log实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。

只要知道name,就能得到 同一个logger实例

2:Log.setLevel(lvl)
设置logger的level, level有以下几个级别:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

  1. log.debug("foobar") # 不输出
  2. log.info("foobar") # 输出
  3. log.warning("foobar") # 输出
  4. log.error("foobar") # 输出
  5. log.critical("foobar") # 输出

3:Log.addHandler(hdlr)
log可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler:   输出到文件
handler还可以设置自己的level以及输出格式。

logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler, 设置默认的格式。
   
* 这些函数: logging.debug()、logging.info()、logging.warning()、
   logging.error()、logging.critical() 如果调用的时候发现root logger没有任何 
   handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情

使用basicConfig来配置root logger的输出格式和level:

  1. import logging
  2. logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
  3. logging.debug('This message should appear on the console')

完整的例子:

  1. class Logger:
  2. '''
  3. 功能:该类主要是日志实例的创建。
  4. :param:filename:文件名字。
  5. :param:logger:创建日志实例的名字。注意这个是变量。而且必须要有的变量。否则日志文件内容会乱。
  6. :return:Log返回一个创建的log的实例。
  7. '''
  8. def __init__(self,filename,logger):
  9. self.filename=filename
  10. self.logger=logger
  11. def log_in(self):
  12. Log=logging.getLogger(self.logger)
  13. Log.setLevel(logging.INFO)
  14. f1=logging.FileHandler(os.path.join(LOG_DIR,self.filename),encoding='utf-8')
  15. f1.setLevel(logging.INFO)
  16. formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
  17. f1.setFormatter(formate)
  18. Log.addHandler(f1)
  19. return Log

day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块的更多相关文章

  1. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  2. Day5 双层装饰器、字符串格式化、生成器、迭代器、递归

    双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} de ...

  3. Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇

    一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...

  4. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

    ## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...

  5. 学习PYTHON之路, DAY 5 - PYTHON 基础 5 (装饰器,字符格式化,递归,迭代器,生成器)

    ---恢复内容开始--- 一 装饰器 1 单层装饰器 def outer(func): def inner(): print('long') func() print('after') return ...

  6. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  7. python函数与模块(装饰器,文件处理,迭代器等)

    os模块 os.system('命令') 利用python调用系统命令,命令可以是以列表或者元组内的元素形式* res import os res=os.system('ipconfig') prin ...

  8. Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)

    全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None ...

  9. 生成器&迭代器,模块

    列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...

随机推荐

  1. 如何在iPhone与iPad上开启firebug

    原文: MARTIN KOOL games - web - dad - sarien.net - q42 - livejs - handcraft How to use Firebug on your ...

  2. iOS 编码规范

    Coding Guidelines for Cocoa https://developer.apple.com/library/prerelease/content/documentation/Coc ...

  3. CentOS的网络配置(终端环境)

    在虚拟机中安装了Server版的CentOS,用于做Hadoop相关的实验.Server版的CentOS默认是没有桌面环境的,eth0的网络默认也没有开启,需要我们手动启动网络. 关键配置说明 网络和 ...

  4. 13.KVM安装之网桥

    安装必须的几个库和软件(最好下载一个163的yum源,速度快点) $ yum -y install kvm python-virtinst libvirt tunctl bridge-utils vi ...

  5. ZooKeeper 编程(一)

    Zookeeper的节点都是存放在内存中的,所以读写速度很快.更新日志被记录到了磁盘中,以便用于恢复数据.在更新内在中节点数之前,会先序列化到磁盘中. 为避免单点失效,zookeeper的数据是在多个 ...

  6. web缓存

    web缓存HTTP协议的一个核心特性,它能最小化网络流量,并且提升用户所感知的整个系统响应速度. 什么能被缓存? *Logo和商标图像 *普通的不变化的图像(例如,导航图标) *CSS样式表 *普通的 ...

  7. Android 利用xUtils框架实现对sqllite的增删改查

    首先下载xUtils,下载地址:https://github.com/wyouflf/xUtils  把下载好的文件压缩,把里面的jar包拷进项目中如图所示: 这里新建一个User类进行测试增删改查 ...

  8. Eclipse 最全快捷键

    英文的

  9. gcc -fvisibility=hidden,-fPIC选项

    1. http://www.tuicool.com/articles/fy6Z3aQ 2. http://www.ibm.com/developerworks/cn/linux/l-cn-sdlsta ...

  10. stm32cube--通用定时器--输入捕获

    用定时器输入捕获做红外线接收实验.(此次试验以通道2为例) ①stm32cube配置 ② ③ ④程序中主要用到的输入捕获相关寄存器 uint16_t tim_sr,tim_ccer,tim_ccr; ...