首页 > 其他 > 详细

一.基础语法

时间:2019-06-21 21:54:10      阅读:115      评论:0      收藏:0      [点我收藏+]

一.基础语法

1.输入与输出

print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串


1.2 简述你对 input()函数的理解?

在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。
在 Python2 中有 raw_input()和 input(), raw_input()和 Python3 中的 input()作用是一样的,input()输入的是什么数据类型的,获取到的就是什么数据类型的。



2.条件与循环

2.1 range 和 xrange 的区别?

两者用法相同,不同的是 range 返回的结果是一个列表,而 xrange 的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时,使用 xrange 性能要比 range 好


2.2 比较两个输出结果l1 versus l2

l1 = []
for i in range(10):
    l1.append({"num": i})
print(l1)


l2 = []
a = {"num": 0}
for i in range(10):
    a['num'] = i
    l2.append(a)
print(l2)




3.文件操作

3.1 4G 内存怎么读取一个 5G 的数据?

方法一:
  可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后再读取后面的 500MB 的数据。
方法二:
  可以通过 linux 命令 split 切割成小文件,然后再对数据进行处理,此方法效率比较高。可以按照行数切割,可以按照文件大小切割。


3.2 大文件处理

现在考虑有一个 jsonline 格式的文件 file.txt 大小约为 10K,之前处理文件的
代码如下所示

 def process():  # process the data
    pass


def get_lines():
    l = []
    with open('file.txt', 'rb') as f:
        for eachLine in f:
            l.append(eachLine)
    return l


if __name__ == "__main__":
    for e in get_lines():
        process(e)          

现在要处理一个大小为 10G 的文件,但是内存只有 4G,如果在只修改 get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有哪些?

def get_lines():
    l = []
    with open('file.txt', 'rb') as f:
        data = f.readlines(60000)
    l.append(data)
    yield l

要考虑到的问题有:
内存只有 4G 无法一次性读入 10G 的文件,需要分批读入。分批读入数据要记录每次读入数据的位置。分批每次读入数据的大小,太小就会在读取操作上花费过多时间。


3.3 read、readline 和 readlines 的区别?

read:读取整个文件。
readline:读取下一行,使用生成器方法。
readlines:读取整个文件到一个迭代器以供我们遍历


3.4 一个打印路径的函数

def print_directory_contents(sPath):
    """
    这个函数接收文件夹的名称作为输入参数
    返回该文件夹中文件的路径
    以及其包含文件夹中的文件路径
    :param sPath: 
    :return: 
    """
    import os
    for sChildPath in os.listdir(sPath):
        sChildPath = os.path.join(sPath, sChildPath)
        if os.path.isdir(sChildPath):
            print_directory_contents(sChildPath)
        else:
            print(sChildPath)



4. 异常

4.1 介绍一下 except 的作用和用法?

except: #捕获所有异常
except: <异常名>: #捕获指定异常
except:<异常名 1, 异常名 2> : 捕获异常 1 或者异常 2
except:<异常名>,<数据>:捕获指定异常及其附加的数据
except:<异常名 1,异常名 2>:<数据>:捕获异常名 1 或者异常名 2,及附加的数据



5. 模块和包

5.1 常用的 Python 标准库都有哪些?

内置模块:
os 操作系统,time 时间,random 随机,pymysql 连接数据库,threading 线程,multiprocessing进程,queue 队列。
第三方库:
django 和 flask 也是第三方库,requests,virtualenv,selenium,scrapy,xadmin,celery,
re,hashlib,md5。
常用的科学计算库(如 Numpy,Scipy,Pandas)。


5.2 赋值、浅拷贝和深拷贝的区别?

assignment

在 Python 中,对象的赋值就是简单的对象引用,这点和 C++不同,如下所示

a = [1, 2, 'hello', ['python', 'C++']]
b = a

在上述情况下,a 和 b 是一样的,他们指向同一片内存,b 不过是 a 的别名,是引用.
我们可以使用 b is a 去判断,返回 True,表明他们地址相同,内容相同,也可以使用 id()函数来查看两个列表的地址是否相同。
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。也就是说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响了 a。

shallow copy

? 浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
浅拷贝有三种形式:切片操作、工厂函数、copy 模块中的 copy 函数。
比如上述的列表 a;
切片操作:b = a[:] 或者 b = [x for x in a];
工厂函数:b = list(a);
copy 函数:b = copy.copy(a);
? 浅拷贝产生的列表 b 不再是列表 a 了,使用 is 判断可以发现他们不是同一个对象,使用 id 查看,他们也不指向同一片内存空间。但是当我们使用 id(x) for x in a 和 id(x) for x in b 来查看 a 和 b 中元素的地址时,可以看到二者包含的元素的地址是相同的。
? 在这种情况下,列表 a 和 b 是不同的对象,修改列表 b 理论上不会影响到列表 a。但是要注意的是,浅拷贝之所以称之为浅拷贝,是它仅仅只拷贝了一层,在列表 a 中有一个嵌套的list,如果我们修改了它,情况就不一样了。
? 比如:a[3].append(‘java‘)。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并未发生变化,指向的都是用一个位置。

deep copy

? 深拷贝只有一种形式,copy 模块中的 deepcopy()函数。
? 深拷贝和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因此,它的时间和空间开销要高。
? 同样的对列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 将不会影响到列表 a,即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何的关联。

拷贝注意点

? 对于非容器类型,如数字、字符,以及其他的“原子”类型,没有拷贝一说,产生的都是原对象的引用。
? 如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。


5.3 双下方法init和new的区别?

__init__  # initial 在对象创建后,对对象进行初始化
__new__   # 是在对象创建之前,开辟一个对象空间,并将该对象空间返回给__init__


5.4 说明os.path 和 sys.path 的区别?

# os.path 主要是用于对系统路径文件的操作
# sys.path 主要是对 Python 解释器的系统环境参数的操作(动态的改变 Python 解释器搜索路径)


5.5unittest是什么?

# 在 Python 中,unittest 是 Python 中的单元测试框架。它拥有支持共享搭建、自动测试、在测试
# 中暂停代码、将不同测试迭代成一组,等的功能。


5.6模块和包是什么?

# 在 Python 中,模块是搭建程序的一种方式。每一个 Python 代码文件都是一个模块,并可以引用
# 其他的模块,比如对象和属性。
# 一个包含许多 Python 代码的文件夹是一个包。一个包可以包含模块和子文件夹



6.Python特性

6.1 Python 是强语言类型还是弱语言类型?

# 强类型:不允许不同类型相加
# 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候
# 脚本语言:一般也是解释型语言,运行代码只需要一个解释器,不需要编译。

Python 是强类型的动态脚本语言


6.2谈一下什么是解释性语言,什么是编译性语言?

# 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,
# 计算机才能执行高级语言编写的程序

# 解释性语言在运行程序的时候才会进行翻译
# 编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成机器语言(可执行文件)


6.3 Python 是如何进行类型转换的?

内建函数封装了各种转换函数,可以使用目标类型关键字强制类型转换,进制之间的转换可以用
int(‘str’,base=’n’)将特定进制的字符串转换为十进制,再用相应的进制转换函数将十进制转换
为目标进制。

可以使用内置函数直接转换的有:

list(tuple_01)
tuple(list_01)


6.4 Python2 与 Python3 的区别?

1) 核心类差异

  1. Python3 对 Unicode 字符的原生支持。
    Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只
    支持 unicode 的 string。Python2 和 Python3 字节和字符对应关系为:
python2 python3 表现 转换 作用
str bytes 字节 encode 存储
unicode str 字符 decode 显示
  1. Python3 采用的是绝对路径的方式进行 import
  2. Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,
    必须用新式类应用多重继承
  3. Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所
    以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。
    Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:TabError:
    inconsistent use of tabs and spaces in indentation.

2) 废弃类差异

  1. print 语句被 Python3 废弃,统一使用 print 函数
  2. exec 语句被 python3 废弃,统一使用 exec 函数
  3. execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read())
  4. 不相等操作符"<>"被 Python3 废弃,统一使用"!="
  5. long 整数类型被 Python3 废弃,统一使用 int
  6. xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高
    了大数据集生成效率
  7. Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、items(),zip(),
    map(),filter(),但是可以通过 list 强行转换:
mydict = dict()
mydict = {"a": 1, "b": 2, "c": 3}
mydict.keys()  # <built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys())  # ['a', 'c', 'b']
  1. 迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)
  2. raw_input 函数被 Python3 废弃,统一使用 input 函数
  3. 字典变量的 has_key 函数被 Python 废弃,统一使用 in 关键词
  4. file 函数被 Python3 废弃,统一使用 open 来处理文件,可以通过 io.IOBase 检查文件类型
  5. apply 函数被 Python3 废弃
  6. 异常 StandardError 被 Python3 废弃,统一使用 Exception

3)修改类差异

  1. 浮点数除法操作符“/”和“//”的区别
    “ / ”:
    Python2:若为两个整形数进行运算,结果为整形,但若两个数中有一个为浮点数,则结果为
    浮点数;
    Python3:为真除法,运算结果不再根据参加运算的数的类型。
    “//”:
    Python2:返回小于除法运算结果的最大整数;从类型上讲,与"/"运算符返回类型逻辑一致。
    Python3:和 Python2 运算结果一样。
  2. 异常抛出和捕捉机制区别

python2

  raise IOError, "file error"  # 抛出异常
  except NameError, err:  # 捕捉异常

python3

  raise IOError("file error")  #抛出异常
  except NameError as err: #捕捉异常
  1. for 循环中变量值区别

    Python2,for 循环会修改外部相同名称变量的值

    i = 1
    print('comprehension: ', [i for i in range(5)])
    print('after:i = ', i)  # i = 4

    Python3,for 循环不会修改外部相同名称变量的值

    i = 1
    print("comprehension: ", [i for i in range(5)])
    print('after: i = ', i)  # i = 1
  2. round 函数返回值区别

    Python2,round 函数返回 float 类型值

    isinstance(round(15.5),int)  #True

    Python3,round 函数返回 int 类型值

    isinstance(round(15.5),float) #True
  3. 比较操作符区别

    Python2 中任意两个对象都可以比较

    11 < 'test'  # True

    Python3 中只有同一数据类型的对象可以比较

    11 < 'test' # TypeError: unorderable types: int() < str()

4)第三方工具包差异

我们在pip官方下载源pypi搜索Python2.7和Python3.5的第三方工具包数可以发现,Python2.7
版本对应的第三方工具类目数量是 28523,Python3.5 版本的数量是 12457,这两个版本在第三方工具
包支持数量差距相当大。
我们从数据分析的应用角度列举了常见实用的第三方工具包(如下表),并分析这些工具包在
Python2.7 和 Python3.5 的支持情况:

分类 工具名 用途
数据收集 scrapy 网页采集,爬虫
数据收集 scrapy-redis 分布式爬虫
数据收集 selenium web 测试,仿真浏览器
数据处理 beautifulsoup 网页解释库,提供 lxml 的支持
数据处理 lxml xml 解释库
数据处理 xlrd excel 文件读取
数据处理 xlwt excel 文件写入
数据处理 xlutils excel 文件简单格式修改
数据处理 pywin32 excel 文件的读取写入及复杂格式定制
数据处理 Python-docx Word 文件的读取写入
数据分析 numpy 基于矩阵的数学计算库
数据分析 pandas 基于表格的统计分析库
数据分析 scipy 科学计算库,支持高阶抽象和复杂模型
数据分析 statsmodels 统计建模和计量经济学工具包
数据分析 scikit-learn 机器学习工具库
数据分析 gensim 自然语言处理工具库
数据分析 jieba 中文分词工具库
数据存储 MySQL-python mysql 的读写接口库
数据存储 mysqlclient mysql 的读写接口库
数据存储 SQLAlchemy 数据库的 ORM 封装
数据存储 pymsql sql server 读写接口库
数据存储 redis redis 的读写接口
数据存储 PyMongo mongodb 的读写接口
数据呈现 matplotlib 流行的数据可视化库
数据呈现 seaborn 美观的数据可是湖库,基于 matplotlib
工具辅助 chardet 字符检查工具
工具辅助 ConfigParser 配置文件读写支持
工具辅助 requests HTTP 库,用于网络访问

5)工具安装问题

windows 环境
Python2 无法安装 mysqlclient。Python3 无法安装 MySQL-python、 flup、functools32、Gooey、Pywin32 、webencodings。
matplotlib 在 python3 环境中安装报错:The following required packages can not be built:freetype, png。需要手动下载安装源码包安装解决。
scipy 在 Python3 环境中安装报错,numpy.distutils.system_info.NotFoundError,需要自己手工下载对应的安装包,依赖 numpy,pandas 必须严格根据 python 版本、操作系统、64 位与否。运行matplotlib 后发现基础包 numpy+mkl 安装失败,需要自己下载,国内暂无下载源

centos 环境下
Python2 无法安装mysql-python和 mysqlclient包,报错:EnvironmentError: mysql_config not found,解决方案是安装 mysql-devel 包解决。使用 matplotlib 报错:no module named _tkinter,安装 Tkinter、tk-devel、tc-devel 解决。
pywin32 也无法在 centos 环境下安装


6.5 关于 Python 程序的运行方面,有什么手段能提升性能?

  1. 使用多进程,充分利用机器的多核性能
  2. 对于性能影响较大的部分代码,可以使用 C 或 C++编写
  3. 对于 IO 阻塞造成的性能影响,可以使用 IO 多路复用来解决
  4. 尽量使用 Python 的内建函数
  5. 尽量使用局部变量


6.6 什么是 Python?

  • Python 是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理,可以加入其他语言的对比
  • Python 是一种解释型语言,Python 在代码运行之前不需要解释
  • Python 是动态类型语言,在声明变量时,不需要说明变量的类型
  • Python 适合面向对象的编程,因为它支持通过组合与继承的方式定义类
  • 在 Python 语言中,函数是第一类对象
  • Python 代码编写快,但是运行速度比编译型语言通常要慢
  • Python 用途广泛,常被用走"胶水语言",可帮助其他语言和组件改善运行状况
  • 使用 Python,程序员可以专注于算法和数据结构的设计,而不用处理底层的细节


6.7 什么是 Python 自省?

Python 自省是 Python 具有的一种能力,使程序员面向对象的语言所写的程序在运行时,能够获得对象的类Python 型。Python 是一种解释型语言,为程序员提供了极大的灵活性和控制力


6.8 你所遵循的代码规范是什么?请举例说明其要求?

PEP8 规范。

  1. 变量
  # 常量:大写加下划线
  USER_CONSTANT = "a constant"
  
  
  # 私有变量 : 小写和一个前导下划线
  """
  Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是
  程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还
  是可以访问到这个变量。
  """
  _private_value = "my private value" 
  
  
  # 内置变量 : 小写,两个前导下划线和两个后置下划线
  """
  两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户
  定义的变量要严格避免这种风格。以免导致混乱
  """
  __class__ = "inner value"
  1. 函数和方法

    总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范

    私有方法 :小写和一个前导下划线
    这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。

    特殊方法 :小写和两个前导下划线,两个后置下划线
    这种风格只应用于特殊函数,比如操作符重载等。
    函数参数 : 小写和下划线,缺省值等号两边无空格

  2. 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确,并足以从
    中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀,例如:

    SQLEngine,MimeTypes 对于基类而言,可以使用一个 Base 或者 Abstract 前缀 BaseCookie,
    AbstractGroup

  3. 模块和包

    除特殊模块 init 之外,模块名称都使用不带下划线的小写字母。
    若是它们实现一个协议,那么通常使用 lib 为后缀,例如:

    import smtplib
    import os
    import sys
  4. 关于参数

    1. 不要用断言来实现静态类型检测。断言可以用于检查参数,但不应仅仅是进行静态类型检测。
      Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。
    2. 不要滥用 *args 和 **kwargs。*args 和 **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器。
  5. 其它

    #  使用 has 或 is 前缀命名布尔元素
    is_connect = True
    has_member = False
    
    # 用复数形式命名序列
    members = ['user_1', 'user_2']
    
    # 用显式名称命名字典
    person_address = {'user_1': '10 road WD', 'user_2': '20 street huafu'}
    
    # 避免通用名称
    诸如 list, dict, sequence 或者 element 这样的名称应该避免
    
    # 避免现有名称
    诸如 os, sys 这种系统已经存在的名称应该避免
  6. 一些数字

    一行列数 : PEP 8 规定为 79 列。根据自己的情况,比如不要超过满屏时编辑器的显示数。
    一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整函数。
    一个类 : 不要超过 200 行代码,不要有超过 10 个方法。一个模块 不要超过 500 行。

  7. 验证脚本

    可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8




7.Linux基础和git

7.1 Linux 的基本命令(怎么区分一个文件还是文件夹)?

# 在显示名称的时候会在文件夹后添加“/”,在文件后面加“*”
ls -F


7.2日志以什么格式,存放在哪里?

日志以文本可以存储在“/var/log/”目录下后缀名为.log


7.3 Linux 查看某个服务的端口?

netstat -anp | grep service_name


7.4ubuntu 系统如何设置开机自启动一个程序?

直接修改/etc/rc0.d ~ /etc/rc6.d 和/etc/rcS.d 文件夹的内容,添加需启动的程序,S 开头的表示启动,K 开头的表示不启动


7.5 在 linux 中 find 和 grep 的区别?

Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
linux 下的 find:

功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
语法:find 起始目录寻找条件操作
说明:find 命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。
简单点说说,grep 是查找匹配条件的行,find 是搜索匹配条件的文件


7.6Linux 重定向命令有哪些?有什么区别?

1、重定向>
Linux 允许将命令执行结果重定向到一个文件,本应显示在终端上的内容保存到指定文件中。如:ls >test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 )。
2、重定向>>

? 这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。


7.7 软连接和硬链接的区别?

软连接类似 Windows 的快捷方式,当删除源文件时,那么软链接也失效了。

硬链接可以理解为源文件的一个别名,多个别名所代表的是同一个文件。当 rm 一个文件的时候,那么此文件的硬链接数减1,当硬链接数为 0 的时候,文件被删除。


7.8 10 个常用的 Linux 命令?

pwd 显示工作路径
ls 查看目录中的文件
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
mkdir dir1 创建一个叫做 'dir1' 的目录'
rm -f file1 删除一个叫做 'file1' 的文件',-f 参数,忽略不存在的文件,从不给出提示。
rmdir dir1 删除一个叫做 'dir1' 的目录'
groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp 目录下
tar -cvfj archive.tar.bz2 dir1 创建一个 bzip2 格式的压缩包
tar -xvfj archive.tar.bz2 解压一个 bzip2 格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个 gzip 格式的压缩包
tar -xvfz archive.tar.gz 解压一个 gzip 格式的压缩包


7.9 Linux 关机命令有哪些?

reboot 重新启动操作系统
shutdown –r now 重新启动操作系统,shutdown 会给别的用户提示
shutdown -h now 立刻关机,其中 now 相当于时间为 0 的状态
shutdown -h 20:25 系统在今天的 20:25 会关机
shutdown -h +10 系统再过十分钟后自动关机
init 0 关机
init 6 重启


7.10 git 合并文件有冲突,如何处理?

1.git merge 冲突了,根据提示找到冲突的文件,解决冲突如果文件有冲突,那么会有类似标记

2.修改完之后,执行 git add 冲突文件名

3.git commit 注意:没有-m 选项 进去类似于 vim 的操作界面,把 conflict 相关的行删除掉直接 push 就可以了,因为刚刚已经执行过相关 merge 操作了




一.基础语法

原文:https://www.cnblogs.com/pankypan/p/11066839.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!