关于Python语法面试题总结

本篇博文用来记录我对python语法不熟悉的知识点
目录

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

    可以使用冒号来定义对齐方式:

    项目 价格 数量
    Computer 1600 元 5
    Phone 12 元 12
    Pipe 1 元 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]来生成目录:

    数学公式

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

    • 行内公式,数学公式为: Γ ( n ) = ( n 1 ) ! n N
    • 块级公式:

    x = b ± b 2 4 a c 2 a

    更多LaTex语法请参考 这儿.

    UML 图:

    可以渲染序列图:

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

    或者流程图:

    Created with Raphaël 2.1.2 开始 我的操作 确认? 结束 yes no
    • 关于 序列图 语法,参考 这儿,
    • 关于 流程图 语法,参考 这儿.

    离线写博客

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

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

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

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

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

    浏览器兼容

    1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
    2. IE9以下不支持
    3. IE9,10,11存在以下问题
      1. 不支持离线功能
      2. IE9不支持文件导入导出
      3. IE10不支持拖拽文件导入


    1. 这里是 脚注内容.

    猜你喜欢

    转载自blog.csdn.net/u011462357/article/details/79370369