本节涉及内容:

    1. 迭代器和生成器

    2. 递归

    3. 字符串格式化

    4. 模块

      内置模块

      自定义模块

      第三方模块

    5. 序列化的模块

        json

        pickle

(一). 迭代器和生成器:

     迭代器:        

      迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

  特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存
  1. >>> mylist = iter([1, 2, 3, 4, 5])
  2. >>> print(mylist.__next__())
  3. 1
  4. >>> print(mylist.__next__())
  5. 2
  6. >>> print(mylist.__next__())
  7. 3
  8. >>> print(mylist.__next__())
  9. 4
  10. >>> print(mylist.__next__())
  11. 5
  12. >>> print(mylist.__next__())
  13. Traceback (most recent call last):
  14. File "<input>", line 1, in <module>
  15. StopIteration

调用迭代器的__next__()方法循环执行每一条条目,条目全部取出后引发StopIteration异常(非错误),表示迭代完成。

    

    生成器:

      一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;

  1. def func(): #func为一个函数称为生成器,
  2. print(1111)
  3. yield 1
  4. print(2222)
  5. yield 2
  6. print(3333)
  7. yield 3
  8. ret = func() #执行func()函数时得到一个迭代器
  9. r1= ret.__next__()#进入函数找到yield,获取yield后边的数据
  10. print(r1)
  11. r2 = ret.__next__()
  12. print(r2)
  13. r3 = ret.__next__()
  14. print(r3)
  15. #输出:
  16. 1111
  17. 1
  18. 2222
  19. 2
  20. 3333
  21. 3
  1. def func():
  2. print(1111)
  3. yield 1
  4. print(2222)
  5. yield 2
  6. print(3333)
  7. yield 3
  8. ret = func()
  9.  
  10. for i in ret: #使用一个for循环可以简化手动的迭代
  11. print(i)
  12. #输出
  13. 1111
  14. 1
  15. 2222
  16. 2
  17. 3333
  18. 3

利用生成器自定义range

  1. def myrange(arg):
  2. start = 0
  3. while True:
  4. if start > arg:
  5. return
  6. yield start
  7. start += 1
  8. ret = myrange(3)
  9. r = ret.__next__()
  10. print(r)
  11. r = ret.__next__()
  12. print(r)
  13. r = ret.__next__()
  14. print(r)
  15. r = ret.__next__()
  16. print(r)
  17. #输出:
  18. 0
  19. 1
  20. 2
  21. 3

  加强的生成器特性:

      send(): 传入一个新的值。

      close(): 抛出异常或者退出

  1. def counter(start = 0):
  2. count = start
  3. while True:
  4. val = (yield count)
  5. if val is not None:
  6. count = val
  7. else:
  8. count += 1
  9. count = counter(5) #将函数传入值5
  10. print(count.__next__()) #通过next迭代每一个值
  11. print(count.__next__())
  12. count.send(8) #通过send可以传入一个新的值来迭代
  13. print(count.__next__())
  14. print(count.__next__())
  15. count.close() #close()函数则可以退出迭代
  16. print(count.__next__()) #再次调用就会出现StopIteration异常
  17.  
  18. #输出:
  19. 5
  20. 6
  21. 9
  22. 10
  23. StopIteration

  (二) 递归

      如果一个新的调用能在相同过程中较早的调用结束之前开始,这个过程即为递归

  1. def func(n):
  2. n += 1
  3. if n >= 5:
  4. return 'end'
  5. return func(n)
  6. r = func(1)
  7. print(r)
  8. #输出:
  9.  
  10. end

递归实现  1*2*3*4*5*6*7  的结果:

  1. def num(n):
  2. if n == 1:
  3. return 1
  4. else:
  5. return (n * num(n - 1))
  6. print(num(7))
  7.  
  8. #输出:
  9.  
  10. 5040

  (三)字符串格式化(引用)

      两种方式:

        1. 百分号(%)

        2. format

      百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。[PEP-3101]

    1. 百分号(%)方式

%[(name)][flags][width].[precision]typecode

  • (name)      可选,用于选择指定的key

  • flags          可选,可供选择的值有:
    • +       右对齐;正数前加正好,负数前加负号;
    • -        左对齐;正数前无符号,负数前加负号;
    • 空格    右对齐;正数前加空格,负数前加负号;
    • 0        右对齐;正数前无符号,负数前加负号;用0填充空白
  • width         可选,占有宽度
  • .precision   可选,小数点后保留的位数
  • 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;)
    • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号

  注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式

  常用格式化:

  1. tpl = "i am %s" % "alex"
  2.  
  3. tpl = "i am %s age %d" % ("alex", 18)
  4.  
  5. tpl = "i am %(name)s age %(age)d" % {"name": "alex", "age": 18}
  6.  
  7. tpl = "percent %.2f" % 99.97623
  8.  
  9. tpl = "i am %(pp).2f" % {"pp": 123.425556, }
  10.  
  11. tpl = "i am %.2f %%" % {"pp": 123.425556, }

  

  2. format方式

[[fill]align][sign][#][0][width][,][.precision][type]

    • fill           【可选】空白处填充的字符
    • align        【可选】对齐方式(需配合width使用)
      • <,内容左对齐
      • >,内容右对齐(默认)
      • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
      • ^,内容居中
    • sign         【可选】有无符号数字
      • +,正号加正,负号加负;
      •  -,正号不变,负号加负;
      • 空格 ,正号空格,负号加负;
    • #            【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
    • ,            【可选】为数字添加分隔符,如:1,000,000
    • width       【可选】格式化位所占宽度
    • .precision 【可选】小数位保留精度
    • type         【可选】格式化类型
      • 传入” 字符串类型 “的参数

        • s,格式化字符串类型数据
        • 空白,未指定类型,则默认是None,同s
      • 传入“ 整数类型 ”的参数
        • b,将10进制整数自动转换成2进制表示然后格式化
        • c,将10进制整数自动转换为其对应的unicode字符
        • d,十进制整数
        • o,将10进制整数自动转换成8进制表示然后格式化;
        • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
        • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
      • 传入“ 浮点型或小数类型 ”的参数
        • e, 转换为科学计数法(小写e)表示,然后格式化;
        • E, 转换为科学计数法(大写E)表示,然后格式化;
        • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
        • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
        • g, 自动在e和f中切换
        • G, 自动在E和F中切换
        • %,显示百分比(默认显示小数点后6位)

  常用格式化:

  1. tpl = "i am {}, age {}, {}".format("seven", 18, 'alex')
  2.  
  3. tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex'])
  4.  
  5. tpl = "i am {0}, age {1}, really {0}".format("seven", 18)
  6.  
  7. tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18])
  8.  
  9. tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)
  10.  
  11. tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})
  12.  
  13. tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
  14.  
  15. tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)
  16.  
  17. tpl = "i am {:s}, age {:d}".format(*["seven", 18])
  18.  
  19. tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)
  20.  
  21. tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})
  22.  
  23. tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
  24.  
  25. tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
  26.  
  27. tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
  28.  
  29. tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

更多格式化操作:https://docs.python.org/3/library/string.html

  (四)模块

     使大量的代码分成有组织的代码段,代码段可以彼此交互引用,增加了代码的重用性。

    模块分为三种:

      1. 内置模块

      2. 自定义模块

      3. 第三方模块

***导入模块***

  1>使用import语句:

格式如下:

  1. import module1 #分行导入
  2. import module2
  3. .....
  4. import module1,module2 #也可以在一行中导入多个模块,用逗号分隔
  1. import sys
  2. improt os
  3.  
  4. or
  5.  
  6. import sys,os

注意: import导入模块的顺序:

   1)内置模块

   2)第三方模块

   3)自定义模块

使用一个空行分割这三类模块的导入语句。模块在顶层导入时为全局作用域,在函数中导入时为局部作用域。

  2> 使用from-import语句:

    导入模块中的指定属性,将指定名称导入当前作用域

格式:

  1. from module import name1[, name2[, nameN]]
  1. from lib import commons
  1. from Tkinter import (Tk, Frame, Button, Text)#按照规范多模块导入时加小括号
  2.  
  3. from Tkinter import * #导入Tkinter下的所有模块

   3> 扩展的import语句(as)

  1. from lib import commons
  2. from var import commons #两个模块名相同
  3.  
  4. #针对这种情况可以使用:
  5.  
  6. from lib import commons as lib.commons
  7. from var import commons as var.commons
  8.  
  9. #之后直接导入模块:
  10.  
  11. import lib.commons,var.commons

  内置模块(引用):

    内置模块是Python自带的功能,在使用内置模块相应的功能时,需要【先导入】再【使用】

  1. sys

用于提供对Python解释器相关的操作:

  1. sys.argv 命令行参数List,第一个元素是程序本身路径
  2. sys.exit(n) 退出程序,正常退出时exit(0)
  3. sys.version 获取Python解释程序的版本信息
  4. sys.maxint 最大的Int
  5. sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  6. sys.platform 返回操作系统平台名称
  7. sys.stdin 输入相关
  8. sys.stdout 输出相关
  9. sys.stderror 错误相关
  1. import sys
  2. import time
  3.  
  4. def view_bar(num, total):
  5. rate = float(num) / float(total)
  6. rate_num = int(rate * 100)
  7. r = '\r%d%%' % (rate_num, )
  8. sys.stdout.write(r)
  9. sys.stdout.flush()
  10.  
  11. if __name__ == '__main__':
  12. for i in range(0, 100):
  13. time.sleep(0.1)
  14. view_bar(i, 100)
  15.  
  16. 进度百分比

  2. os

用于提供系统级别的操作:

  1. os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
  2. os.chdir("dirname") 改变当前脚本工作目录;相当于shellcd
  3. os.curdir 返回当前目录: ('.')
  4. os.pardir 获取当前目录的父目录字符串名:('..')
  5. os.makedirs('dir1/dir2') 可生成多层递归目录
  6. os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  7. os.mkdir('dirname') 生成单级目录;相当于shellmkdir dirname
  8. os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shellrmdir dirname
  9. os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
  10. os.remove() 删除一个文件
  11. os.rename("oldname","new") 重命名文件/目录
  12. os.stat('path/filename') 获取文件/目录信息
  13. os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
  14. os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
  15. os.pathsep 用于分割文件路径的字符串
  16. os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix'
  17. os.system("bash command") 运行shell命令,直接显示
  18. os.environ 获取系统环境变量
  19. os.path.abspath(path) 返回path规范化的绝对路径
  20. os.path.split(path) path分割成目录和文件名二元组返回
  21. os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
  22. os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
  23. os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
  24. os.path.isabs(path) 如果path是绝对路径,返回True
  25. os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
  26. os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
  27. os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
  28. os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
  29. os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

  第三方模块:

    在Python中,安装第三方模块,是通过setuptools这个工具完成的。Python有两个封装了setuptools的包管理工具:easy_installpip。目前官方推荐使用pip

  1. pip3 install requests #这里使用pip3的版本
  1. import requests,json
  2.  
  3. response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京') #调取北京天气的借口
  4. response.encoding = 'utf-8' #设置字符编码
  5. dic = json.loads(response.text) #通过json序列化成一个字典
  6. print(dic,type(dic))
  7.  
  8. print(response.status_code) #查看响应状态码
  9.  
  10. #输出内容:
  11.  
  12. {'status': 1000, 'data': {'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。', 'yesterday': {'fx': '无持续风向', 'high': '高温 30℃', 'fl': '微风', 'date': '5日星期日', 'type': '多云', 'low': '低温 18℃'}, 'wendu': '', 'forecast': [{'high': '高温 31℃', 'fengli': '微风级', 'fengxiang': '无持续风向', 'date': '6日星期一', 'type': '多云', 'low': '低温 19℃'}, {'high': '高温 24℃', 'fengli': '微风级', 'fengxiang': '无持续风向', 'date': '7日星期二', 'type': '雷阵雨', 'low': '低温 16℃'}, {'high': '高温 31℃', 'fengli': '微风级', 'fengxiang': '无持续风向', 'date': '8日星期三', 'type': '多云', 'low': '低温 20℃'}, {'high': '高温 32℃', 'fengli': '3-4级', 'fengxiang': '南风', 'date': '9日星期四', 'type': '晴', 'low': '低温 22℃'}, {'high': '高温 30℃', 'fengli': '微风级', 'fengxiang': '无持续风向', 'date': '10日星期五', 'type': '雷阵雨', 'low': '低温 20℃'}], 'aqi': '', 'city': '北京'}, 'desc': 'OK'} <class 'dict'>
  13. 200 #状态码

  自定义模块:    

  1. #s1.py
  2.  
  3. def login():
  4. print("login")
  5.  
  6. def logout():
  7. print("logout")
  1. #s2.py
  2.  
  3. import s1
  4.  
  5. s1.login()
  6. s1.logout()
  7.  
  8. #输出:
  9. login
  10. logout

  (五) 序列化模块:

       json

         pickle

   json:

     dumps: 将Python的基本数据类型转换成字符串形式

     loads: 将Python字符串形式转换成可用数据类型

  1. import json
  2.  
  3. # dumps
  4. # loads
  5.  
  6. dic = {"k1":"v1"}
  7. print(dic,type(dic))
  8. result = json.dumps(dic)
  9. print(result,type(result))
  10.  
  11. s1 = '{"k1": 123}'
  12. dic = json.loads(s1) #通过loads反序列化时,一定要使用双引号“”
  13. print(dic,type(dic))
  14.  
  15. #输出:
  16. {'k1': 'v1'} <class 'dict'>
  17. {"k1": "v1"} <class 'str'>
  18. {'k1': 123} <class 'dict'>

   dump #将json数据写入json文件里

   load   #将json文件里的数据读出来显示

  1. dump #将json数据写入json文件里
  2. load #将 json文件里的数据读出来显示
  3.  
  4. import json
  5. #li = [11,22,33]
  6. li = {"hong":123,"fei":345} #定义字典
  7. print(type(li))
  8. json.dump(li,open('db','w')) #写入字典到json文件db
  9. li = json.load(open('db','r')) #读出db里内容
  10. print(type(li),li)
  11.  
  12. #输出:
  13. <class 'dict'>
  14. <class 'dict'> {'hong': 123, 'fei': 345}
  15. #db内容:
    16{"hong": 123, "fei": 345}

  pickle模块:

    与json类似,但只能用于Python,json则可以跨平台。

    dumps

    loads

  1. import pickle
  2. li = [11,22,33]
  3. r = pickle.dumps(li)
  4. print(r)
  5.  
  6. result = pickle.loads(r)
  7. print(result)
  8. #输出:
  9.  
  10. b'\x80\x03]q\x00(K\x0bK\x16K!e.'
  11. [11, 22, 33]

  dump

  load

  1. import pickle
  2.  
  3. li = [11,22,33]
  4. pickle.dump(li,open('db','wb'))
  5. result = pickle.load(open('db','rb'))
  6. print(result)
  7.  
  8. #输出:
  9. [11, 22, 33] #通过load读出来原格式
  10. #db文件内容:
  11. �]q (KKK!e. 无法识别的编码

  

    json与pickle的对比:

       json:更加适合跨语言,字符串,基本数据类型

       pickle:仅适用于Python ,Python的所有类型的序列化

  

  本节内容先总结到这里,新内容后续补充,谢谢查看! 

Python之模块,迭代器与生成器的更多相关文章

  1. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  2. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  3. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  4. python各种模块,迭代器,生成器

    从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名就是test) 包:用来从逻辑上组织模块的,本质就是一个目 ...

  5. 1.17 Python基础知识 - 迭代器和生成器初识

    可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象. 列表解析表达式:可以简单高效处理一个可迭代对象,并生成结果列表 示例代码: [ i ** 2 for i in range(10) ] ...

  6. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  7. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  8. Python学习之迭代器和生成器

    那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...

  9. Python系列之 迭代器和生成器

    很多Python的程序员都会混淆 迭代器 和 生成器 的概念和作用,分不清到底两个有什么区别.今天我们来好好说一说这两个概念. 迭代器(Iterator) Iterator Pattern Itera ...

  10. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

随机推荐

  1. jquery修改css样式,样式带!important

    由于需求的需要,今天在用jquery修改一个弹出框的样式的时候,由于有一个按钮有padding-left:12px;导致内间距空出来的这一块颜色用普通的方式无法改变. 普通的jquery修改css的方 ...

  2. MVP之V和P的交互

    三者之间的关系 在MVP初探里简单的描述了V和P之间是如何交互的. 无论是PV还是SC,M\V\P这三者之间的关系并没有发生改变,V只是前端的客户代理承现展显数据,P是如何处理客户交互行为的决策者. ...

  3. [CareerCup] 1.1 Unique Characters of a String 字符串中不同的字符

    1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...

  4. .net线程池

    线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程池,所以了解线程池的内幕有助于你写出更好的程序.由于篇幅有限,在这里我只讲解以下核心概念: 线程池的大小 如何调用线程池添加任务 ...

  5. 【C#】C#容易忽视的错误

    1.string 拼接站内存,前提是字符串比较多的时候string 字符串类型拼接占内存,解决方法就是用 StringBuilder和String.Format2.不知道内置的验证数据类型的方法. ; ...

  6. Linux 命令积累

    1, su root 切换到root用户 su user 切换到普通用户 2, mkdir / touch 创建文件夹 /文件 3, vi 打开编辑文件 按insert进入编辑模式 编辑完成后 按es ...

  7. python 中文乱码问题2

    1.文件存为utf-8的格式,windows和linux两个环境都可以用 2.中文输出可以采用u方法 比如:print u'成年'

  8. 【poj2449】 Remmarguts' Date

    http://poj.org/problem?id=2449 (题目链接) 题意 求有向图K短路. Solution A*.g(x)为当前节点到起点的步数,h(x)为当前节点到终点的最短距离(也就是估 ...

  9. 【bzoj3124】 Sdoi2013—直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 (题目链接) 题意 求树的直径以及直径的交. Solution 我的想法超麻烦,经供参考..思 ...

  10. js 时间戳转换成几分钟前,几小时前,几天前

    formatMsgTime (timespan) { var dateTime = new Date(timespan); var year = dateTime.getFullYear(); var ...