基础知识
遇到的疑惑
一边看代码,一边学习
1、什么是args和kwargs?
*args 代表多个无名参数, 是一个tuple,**kwargs 关键字参数,是一个 dict。废话少说,上代码:
示例
。
def foo(*args, **kwargs):
print 'args = ', args
print 'kwargs = ', kwargs
print '---------------------------------------'
if __name__ == '__main__':
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo('a', 1, None, a=1, b='2', c=3)
输出结果
:
args = (1, 2, 3, 4)
kwargs = {}
---------------------------------------
args = ()
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = (1, 2, 3, 4)
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = ('a', 1, None)
kwargs = {'a': 1, 'c': 3, 'b': '2'}
---------------------------------------
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
2、注释
单行注释以 # 开头,多行注释用三个单引号 ‘’’ 或者三个双引号 “”" 将注释括起来
3、tempfile
生成临时文件和目录,、NamedTemporaryFile、TemporaryDirectory 和 SpooledTemporaryFile 是带有自动清理功能的高级接口
4、with-as语法
https://www.jianshu.com/p/c00df845323c
5、句柄
Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。
系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。
数值上,是一个32位无符号整型值(32位系统下);
逻辑上,相当于指针的指针;
形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;
作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。
Handle,Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。
简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)、
5、subprocess
可以在当前命令中执行其他程序和命令
subprocess.Popen 类
创建并返回一个子进程,并在这个进程中执行指定的程序。
同 Linux 中创建子进程类似,父进程创建完子进程后,并不会自动等待子进程执行,父进程在子进程之前推出将导致子进程成为孤儿进程,孤儿进程统一由 init 进程接管,负责其终止后的回收工作。
如果父进程在子进程之后终止,但子进程终止时父进程没有进行最后的回收工作,子进程残留的数据结构称为僵尸进程。大量僵尸进程将耗费系统资源,因此父进程及时等待和回收子进程是必要的,除非能够确认自己比子进程先终止,从而将回收工作过渡给 init 进程。这个等待和回收子进程的操作就是wait()函数。child.wait() 等待子进程 p 终止,返回 p.returncode 属性:该属性表示子进程的返回状态,returncode可能有多重情况:
None —— 子进程尚未结束;
==0 —— 子进程正常退出;
> 0—— 子进程异常退出,returncode对应于出错码;
< 0—— 子进程被信号杀掉了。
6、fileno()
fileno()方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作
6、File seek()
fileObject.seek(offset[, whence])
offset:偏移量
whence:从哪个位置开始偏移,0:文件开头,1:当前位置,2:文件末尾,默认为0
6、split()
默认分隔符为 空格,\n,\r
7、os.path.join()
拼接路径
import os
print("1:",os.path.join('aaaa','/bbbb','ccccc.txt'))
print("2:",os.path.join('/aaaa','/bbbb','/ccccc.txt'))
print("3:",os.path.join('aaaa','./bbb','ccccc.txt'))
#1: /bbbb/ccccc.txt
#2: /ccccc.txt
#3: aaaa/./bbb/ccccc.txt
split,rsplit,splitlines
split()从左向右寻找,以某个元素为中心将左右分割成两个元素并放入列表中
rsplit()从右向左寻找,以某个元素为中心将左右分割成两个元素并放入列表中
splitlines()根据换行符(\n)分割并将元素放入列表中
举个例子:
1 a = "dlrblist"
2 a1 = a.split("l", 1)
3 print(a1)
输出结果:
['d', 'rblist']
从左向右寻找,以寻找到的第一个"l"为中心将左右分割成两个元素并放入列表中
1 b = "dlrblist"
2 b1 = b.rsplit("l", 1)
3 print(b1)
输出结果:
['dlrb', 'ist']
从右向左寻找,以寻找到的第一个"l"为中心将左右分割成两个元素并放入列表中
1 c = "hello\nworld\ndlrb"
2 c1 = c.splitlines()
3 print(c1)
输出结果:
['hello', 'world', 'dlrb']
根据换行符切割成了三个元素并放入列表中
生成器(Generator)
一边循环一边计算的机制,generator保存的是算法
方法:
1、把[]改位(),示例如下 获取生成器中的元素 用next()方法或者for元素
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
>>> next(g)
0
>>> for n in g:
... print(n)
2、如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
函数
zip
>>> zip ([1,2,3],[4,5,6])
[(1,4),(2,5),(3,6)]
capitalize
str.capitalize() 将字符串的第一个字母变成大写,其他字母变小写
**
幂 a**b a的b次幂
迭代器
可以直接作用于for循环的类型,可迭代对象(Iterable):
集合数据类型 list,tuple,dict,set,str
generator 类型
可以被next()函数不断调用并返回下一个值的对象称为 Iterator,惰性的计算序列
可以使用 iter()函数把list,dict,str转换位 Iterator
高阶函数
map/reduce
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
reduce()把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
filter
filter()也接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素,函数返回的是一个Iterator
sorted
可以接收一个key函数来实现自定义的排序,实现一个映射函数
高阶函数的特性:
除了接受函数作为参数外,还可以把函数作为返回值返回,”闭包“(Closure), 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
def createCounter():
m=0
def counter():
#内部函数修改外部函数局部变量
nonlocal m
m=m+1
return m
return counter
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA())
# 容器法,搞不懂
def createCounter():
m=[0]
def counter():
m[0]=m[0]+1
return m[0]
return counter
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA())
#1 2 3 4 5
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎