您的位置:首页 > 编程语言 > Python开发

关于Python语法面试题总结

2018-02-25 17:51 447 查看
本篇博文用来记录我对python语法不熟悉的知识点

目录

Python中的yield函数
生成器简介

生成器函数

生成器的send

检查列表为空的方法
如何判断是否为np.nan

pandas对多列fillna()

pandas如何根据其他两列决定某一列的值

Python中的复制
快捷键

Markdown及扩展
表格

定义列表

代码块

numpy读写二进制文件

脚注

目录

数学公式

UML 图:

离线写博客

浏览器兼容

Python中的yield函数

参考:http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html

生成器简介

首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

生成器函数

使用生成器函数定义生成

def get_0_1_2():
yield 0
print("yiled 0 finished")
yield 1
print(("yiled 1 finished"))
yield 2
print("yiled 2 finished")

>>>get_0_1_2
<function get_0_1_2 at 0x000001A143A44B70>


我们定义了一个函数get_0_1_2,并且可以查看到这确实是函数类型。但与一般的函数不同的是,get_0_1_2的函数体内使用了关键字yield,这使得get_0_1_2成为了一个生成器函数。生成器函数的特性如下:

调用生成器函数将返回一个生成器;

>>>generator = get_0_1_2()
>>>generator
<generator object get_0_1_2 at 0x000001A143A31F68>


第一次调用生成器的next方法时,生成器才开始执行生成器函数(而不是构建生成器时),直到遇到yield时暂停执行(挂起),并且yield的参数将作为此次next方法的返回值;

>>>generator.__next__()
0


之后每次调用生成器的next方法,生成器将从上次暂停执行的位置恢复执行生成器函数,直到再次遇到yield时暂停,并且同样的,yield的参数将作为next方法的返回值;

如果当调用next方法时生成器函数结束(遇到空的return语句或是到达函数体末尾),则这次next方法的调用将抛出StopIteration异常(即for循环的终止条件);

>>>generator.__next__()
yiled 0 finished
1
>>>generator.__next__()
yiled 1 finished
2
>>>generator.__next__()
yiled 2 finished
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration


生成器函数在每次暂停执行时,函数体内的所有变量都将被封存(freeze)在生成器中,并将在恢复执行时还原,并且类似于闭包,即使是同一个生成器函数返回的生成器,封存的变量也是互相独立的。 (这点我真的不懂,可以看原文)

生成器的send

send是除next外另一个恢复生成器的方法。Python 2.5中,yield语句变成了yield表达式,这意味着yield现在可以有一个值,而这个值就是在生成器的send方法被调用从而恢复执行时,调用send方法的参数。

def repeater():
n=666
while True:
n=(yield n)
r=repeater()
r.send(10)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: can't send non-None value to a just-started generator
r.__next__()
666
r.send(5)
5


*调用send传入非None值前,生成器必须处于挂起状态,否则将抛出异常。不过,未启动的生成器仍可以使用None作为参数调用send。

*如果使用next恢复生成器,yield表达式的值将是None。

检查列表为空的方法

>>>a=[]
>>>b=[1]
>>>bool(a)
False
>>>bool(b)
True
>>>not a
True
>>>not b
False
>>>len(a)==0
True
>>>len(b)==0
False


总结:

用空列表的bool值判断才是最pythonic的方法

if not a:

print(“list a is empty”)

虽然我也常用len判断

如何判断是否为np.nan

摘自http://www.mamicode.com/info-detail-1723210.html

总之,想判断一个单元格是不是np.nan,要用is np.nan,不能用==np.nan

pandas中DataFrame,Series 都有 isnull()方法,而数据框却没有,用了就会报错:AttributeError: ‘float‘ object has no attribute ‘isnull‘

怎么判断单个框是否为 np.nan

Python常规的判断,==,和is, 这对None是有效的

None is None

Out[49]: True

None == None

Out[50]: True

而对,np.nan,只能用is

np.nan != np.nan

Out[43]: True

np.nan也不是None

None == np.nan

Out[46]: False

None!= np.nan

Out[47]: True

None is np.nan

Out[48]: False

这和 is 和==的判断方法不同有关,is 判断是否为同一个对象,比如常量,常量字符串

1 is 1

Out[51]: True

而’== ’ 是值判断,两个变量值是否相等。

u = 156

v = 156

u is v

Out[58]: True

因为,Python,对变量赋值是用的引用,默认传的是地址,所以,赋的是同一个 对象,也会是 同一个对象

u = 156.0

u is v

Out[60]: False

u == v

Out[61]: True

一个赋值整数,一个赋值浮点数时就 不指向一个对象了。 只是值相等而已

回到开始,np.nan 应该是没有值的,所以不能值判断,只用对象引用判断,而None有空值,所以也可以值判断。

pandas对多列fillna()

应该写成

data.fillna({'Week2':0,'Week3':0,'Week4':0,'Week5':0,'Week6':0,'Week7':0,'Week8':0,'Week9':0,'Week10':0,'Week11':0,'Week12':0,'Week13':0,'Week14':0},inplace=True)


不能写成

data[['Week2','Week3','Week4','Week5','Week6']].fillna(0,inplace=True)


后者这种写法是无效的, 并不会改变原data,我理解是因为后者这种写法相当于开辟了一块新的内存,因为会有警告说‘SettingWithCopyWarning:

A value is trying to be set on a copy of a slice from a DataFrame’

pandas如何根据其他两列决定某一列的值

import  pandas as pd
import  numpy as np
def set_color(row):
if row["Set"] == "Z":
return "red"
elif row["Type"] == "C":
return "blue"
else:
return "green"

df = pd.DataFrame({'Type':list('ABCD'), 'Set':list('ZZXY'),'Num':list('1234')})
>>>df
Out[1]:
Num Set Type  color
0   1   Z    A    red
1   2   Z    B    red
2   3   X    C   blue
3   4   Y    D  green


Python中的复制

非常好的解释:

https://iaman.actor/blog/2016/04/17/copy-in-python

Markdown和扩展Markdown简洁的语法

代码块高亮

图片链接和图片上传

LaTex数学公式

UML序列图和流程图

离线写博客

导入导出Markdown文件

丰富的快捷键

快捷键

加粗
Ctrl + B


斜体
Ctrl + I


引用
Ctrl + Q


插入链接
Ctrl + L


插入代码
Ctrl + K


插入图片
Ctrl + G


提升标题
Ctrl + H


有序列表
Ctrl + O


无序列表
Ctrl + U


横线
Ctrl + R


撤销
Ctrl + Z


重做
Ctrl + Y


Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目价格
Computer$1600
Phone$12
Pipe$1
可以使用冒号来定义对齐方式:

项目价格数量
Computer1600 元5
Phone12 元12
Pipe1 元234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A

定义 B

项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''


numpy读写二进制文件

import  numpy as np
a=np.arange(0,20)
a.shape=4,5#4行5列
a.tofile("asample.bin")
b=np.fromfile("asample.bin")#不对,因为没有设置dtype
b2=np.fromfile("asample.bin",dtype=np.int32)#dtype应与a.dtype一致

>>>b
Out[2]:
array([2.12199579e-314, 6.36598737e-314, 1.06099790e-313, 1.48539705e-313,
1.90979621e-313, 2.33419537e-313, 2.75859453e-313, 3.18299369e-313,
3.60739285e-313, 4.03179200e-313])

>>>b2
Out[3]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])

>>>b2.shape=4,5
>>>b2
Out[5]:
array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])


从上面的例子可以看出,在读入数据时:需要正确设置dtype参数,并修改数组的shape属性才能得到和原始数据一致的结果。无论数据的排列顺序是C语言格式还是Fortran语言格式,tofile()都统一使用C语言格式输出。此外如果指定了sep参数,则fromfile()和tofile()将以文本格式对数组进行输入输出。sep参数指定的是文本数据中数值的分隔符。

详见:https://www.cnblogs.com/dmir/p/5009075.html

脚注

生成一个脚注1.

目录

[TOC]
来生成目录:

Python中的yield函数
生成器简介

生成器函数

生成器的send

检查列表为空的方法
如何判断是否为np.nan

pandas对多列fillna()

pandas如何根据其他两列决定某一列的值

Python中的复制
快捷键

Markdown及扩展
表格

定义列表

代码块

numpy读写二进制文件

脚注

目录

数学公式

UML 图:

离线写博客

浏览器兼容

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

行内公式,数学公式为:Γ(n)=(n−1)!∀n∈NΓ(n)=(n−1)!∀n∈N。

块级公式:

x=−b±b2−4ac−−−−−−−√2ax=−b±b2−4ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.2张三张三李四李四嘿,小四儿, 写博客了没?李四愣了一下,说:忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.2开始我的操作确认?结束yesno

关于 序列图 语法,参考 这儿,

关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 [/i] 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。

IE9以下不支持

IE9,10,11存在以下问题

不支持离线功能

IE9不支持文件导入导出

IE10不支持拖拽文件导入

这里是 脚注 的 内容.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: