python基础部分
C、C++、C#、Java、php、python语言的内在特性及区别
参考:https://blog.csdn.net/zllzb2011/article/details/47169479
一般而言 C、C++、Java被视为同一系语言,他们长期占据着程序使用榜前三名
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,与传统程序不同 Java语言是个简单 面向对象 分布式 解释性 健壮 安全与系统无关 可移植 高性能 多线程和动态的语言
Python 是一种面向对象 直译式计算机程序设计语言,python语法简介而清晰,具有丰富和强大的类库,可以把其他语言制作成模块,连接在一起
python是完全面向对象的语言.并且完全支持继承,重载\派生\多继承 有益于增强源代码的复用性
python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。
PHP 中文名:超文本预处理器 是一种通用开元脚本语言语法吸收了C语言 Java的特点,入门门槛低,易学习,使用广泛
与其他程序相比,PHP是将程序嵌入到HTML文档中执行,执行效率比CGI要高许多,所有CGI的功能PHP都能实现,PHP支持所有流行的数据库以及操作系统,最重要的是PHP可以用C C++进行程序扩展
编译型语言和解释型语言的区别
编译型:将代码一次性全部编译成二进制,然后再运行。
优点:执行效率高。 (将代码一次性全部编译成二进制)
缺点:开发效率低
代表语言:C语言
解释型:代码逐行解释,解释成二进制,然后运作。
优点:开发效率高
缺点:执行效率低 (代码逐行解释)
代表语言:python
python解释器的种类以及特点
Cpython C语言开发的使用最广泛解释器
IPython 基于Cpython之上的一个交互式计时器 交互方式增强功能和CPython一样
PyPy 目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
JPython 运行在Java上的解释器 直接把python代码编译成Java字节码执行
IronPython 运行在微软 .net 平台上的解释器,把python代码编译成 .net的字节码
列举python2和python3的区别
参考:https://blog.csdn.net/pangzhaowen/article/details/80650478
1、 python3 对 Unicode 字符的原生支持,所以只有string(文本字符串) 一种类型,字节序列用byte表示
python2中使用ASCII码作为默认编码方式 导致string有两种类型str(字节序列) 和Unicode(文本字符串)
2、 python3采用绝对路径的方式进行import 导入
python2 采用相对路径的方式进行import 导入 这样使标准库导入变得困难
3、 python3统一采用新式类。
python2存在老式类和新式类的区别,新式类声明要求继承object 必须用新式类应用多重继承
4、 python2源码不规范,混乱,重复 python3 重整源码后代码优美,清晰简单
5、python2中 range代表自定义的数字列表,xrange代表可迭代对象
python3中仅有range,直接代表可迭代对象
6、 python2 中没有定义nonlocal python3中弄nonlocal 表示将局部变量更改
global:声明一个全局变量。在局部作用域想要对全局作用域的全局变量进行修改,需要global(可变类型的不需要)
nonlocal:在局部作用域中,对父级作用域(或者更外层的非全局作用域)的变量进行引用和修改,并且引用的那一层,从那一层以下,此变量全部发生改变
7、Python2支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数)
但是python3则将 long 和 int 类型合并,只有int类型
python2项目如何迁移成python3项目
介绍一个python自带的工具2to3 它就在scripts目录下
1、如果在window系统中使用命令会有点麻烦,首先找到python的所在目录,并进入
2、找到你要转化的目录,次数可以是单个文件也可以是一个目录
C:\WINDOWS\system32> cd C:\ProgramData\Anaconda3\Scripts 找到2to3
C:\ProgramData\Anaconda3\Scripts> .\2to3.exe -w E:\xxx\xxx.py 进行转化
没有-w命令好像就只是列出修改内容而不修改,加上-w后执行修改而且会多出一个.bak文件保留原来的版本
还有其他命令选项:
-f选项钦定了只使用某几个规则进行转换其余忽略,
-x 选项与之相反,排除某个规则不做转换。规则的名字需按文档列出的写
另外文档指出有些规则需要显式的(explicit)指定才可执行
2to3 -f imports -f has_key example.py
-o 或 --output-dir 指定输出文件目录,
-W 或 --write-unchanged-files顾名思义,没有可改的也要输出
-v可以输出更多信息,
-add-suffix 可以在输出文件名末尾加后缀
python中 is 和 == 的区别
python中的对象包含三要素:id type value
其中id 用来标识唯一一个对象,type 标识对象的类型, value是对象的值
is 是判断 a对象是否就是 b 对象 是通过id 进行判断的
== 是判断 a对象的值是否和b对象相等,是通过value来判断的
PEP8规范
参考:https://www.jianshu.com/p/ffcc66bab3ce
缩进
每一级应缩进4个空格
行的最大长度 最大字符数为79 如果没有结构化限制的大块文本(注释),每行字符在72
空行
顶层函数和类的定义 前后两个空行
类的方法定义 用一行隔开
import导入
通常要分开导入
位于文件的顶部
导入顺序: 标准库 第三方库 本地库 (每一组之间加入空行)
推荐使用绝对路径导入
注释
当代码更改时,优先更新对应的注释
行内注释 是# 加 一个空格
ascii unicode gbk utf-8 的区别
ASCII 在计算机诞生之初就出现了,内容包括特殊字符,数字,字母
在当时用8位(1字节)表示1字符 【8位中的第一位是预留位,都是0】
Unicode 万国码 (希望将所有国家的文字用二进制表示)
创建初期 用16位(2字节)表示1字符,后来发现不够就进行了升级用32位(4字节)表示1字符
但是这样会有一个很蛋疼的问题,资源的浪费所以不同的国家对Unicode进行了升级
utf-8:最少用8位(1字节)表示一个字符
字母,数字,特殊字符用一个字节表示
欧洲文字用两个字节表示
亚洲文字用三个字节表示
gbk(国家标准):中国针对Unicode进行的改良与utf-8没有太多关系
注意:Unicode是继承了ASCII码,而utf-8和gbk都是通过Unicode改良的,所以,在一定程度上(数字字母,特殊字符)utf-8和gbk是互通的
字母用一个字节表示
汉字用两个字节表示
字节码和机器码的区别
参考:https://www.jianshu.com/p/9f1902de3fcb
机器码(machine code):也叫原生码,是电脑的CPU可以直接解读的数据
通常意义上理解,机器码就是计算机可以直接执行,并且执行速度对快的代码,但是非常晦涩难懂,也比较难编写,一般人员接触不到
字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
可以说:字节码是一种中间状态(中间码),的二进制代码(文件)需要直译器转译后才能成为机器码
python中的三元表达式
表达式1 if 条件表达式 else 表达式2
当表达式返回True时,返回结果表达式1,否则返回结果表达式2。
示例: c = a if a < b else b
文件操作时:readlines 和 xreadlines 的区别是
返回值不同,但使用方法相同
f = open('./test.txt')
f = open('.\te.text')
for r in f.readlines() for x in f.xreadlines()
print(r) # 返回列表 print(x) # 返回生成器 python2中存在xreadlines
f.close() # 关闭文件句柄
什么是反射,以及应用场景
反射:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
应用场景:在web框架里经常被使用
简述python的深浅拷贝
赋值:数据完全共享
注意,这里有一个坑
如果数据是可变类型,比如列表,修改其中一个,则另一个必定改变
如果是不可变类型,比如字符串,修改了一个,另一个并不会改变
s = '你好'
d = s
print(d,s) # 你好 你好
d = '哈哈哈'
print(d,s) # 哈哈哈 你好
拷贝:原则上就是把数据分离出来,复制其数据
浅拷贝:仅仅拷贝第一层,第二层开始进行数据共享 注意:切片也是浅拷贝
深拷贝:将数据完完全全赋值一份放到另一个内存中
python的可变类型和不可变类型的区别
可变类型(mutable):列表,字典
不可变类型(unmutable):数字,字符串,元组
这里的可变不可变,是指内存中的那块内容(value)是否可以被改变。如果是不可变类型,在对对象本身操作的时候,必须在内存中新申请一块区域(因为老区域#不可变#)。
如果是可变类型,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的内存地址会保持不变,但区域会变长或者变短。
可以使用内置函数id()来确认对象的身份在两次赋值前后是否发生了变化。
*不可变类型有什么好处?
如果数据是不可变类型,当我们把数据传给一个不了解的API时,可以确保我们的数据不会被修改。
如果我们要操作一个从函数返回的元组,可以通过内置函数list()把它转换成一个列表。[元祖被称为只读列表,即数据可以被查询但是不能被更改,但是列表可以]
栈、队列、线性列表、二叉树那个不是线性结构
数据结构中数据的逻辑结构分为线性结构和非线性结构
线性结构是一个有序的数据元素的结合,简单的说是 n 个数据元素的有序(次序)集合
常用的线性结构有:线性表,栈队列,双队列,数组,串
常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树),图
特征:
集合中必定存在唯一的一个"第一元素"
集合中必定存在唯一的一个"最后的元素"
数据结构中线性结构指的是数据元素之间存在着"一对一"的线性关系的数据结构
如(a0,a1,a2,.....,an),a0为第一个元素,an为最后一个元素,此集合即为一个线性结构的集合。
模糊的说:有索引(有序)的集合 就是线性结构
描述dict中的dict 的item() 和 iteritems() 有什么不同
item方法作用是:可以将字典中所有项,以类似列表方式返回.因为字典是无序的所以用item返回的内容也是无序的
iteritems方法作用是:于item方法相比作用大致相同,只是他的返回值不是列表,而是迭代器
他们的调用方法是一样的: 变量.方法()
请列举python代码检测工具以及它们之间的区别
1)PyFlakes:静态检查Python代码逻辑错误
2)PeP8:静态检查PEP8编码风格的工具
3)NedBatchelder’s McCabe script:静态分析Python代码复杂度的工具。
介绍一下 try except 的用法和作用
try:
print(1/0) # 被除数不能为0,相关错误类型为ZeroDivisionError
except Exception as e: # 用 Exception 可以将错误信息直接输出
print(e) # 输出内容为division by zero
try except 是用来捕捉异常的,所以,程序执行的时候,首先会执行try 部分 如果try 报错,则执行except部分,如果try部分没错,程序就会跳过except部分
获取python解释器版本的方法有哪些
import platform
print(platform.python_version()) # 3.6.5
import sys
print(sys.version)
# 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
print(sys.version_info)
# sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
注意: 如果模块是被导入的,__name__的值是 模块的文件路径和文件名 如果是直接执行__name__ 那他的值是 __main__
如何判断一个变量是否是字符串
该题考察的是变量的概念
1、变量是由数字、字母、下划线组成
2、不能以数字开头
3、不能是python的关键词
4、必须具有可读性
5、不能是中文
6、不能太长
list(列表) 和 tuple(元祖) 有什么不同
元祖也叫只读列表,所以仅能查看,不能修改; 列表是既可以查看也可以修改
当元祖中仅有一个元素是,需要在元素后面加 " , " ;列表则不需要担心
元祖的内置方法比列表的内置方法要少很多
列表还有列表推导式,这是元祖所没有的
元祖可以在映射或集合中充当键的作用,列表则不行
有什么手段能提升python程序的运行性能
1、使用多进程,充分利用机器的多核性能
2、对于性能影响较大的部分代码,可以使用 C 或 C++ 来编写
3、对于 IO 阻塞造成的性能影响,可以使用 IO 多路复用来解决
4、尽量使用Python的内置函数
5、尽量使用局部变量
关于 IO 多路复用可以详细查看 漫谈五种IO模型
关于python的数学模块:math
详查:https://www.cnblogs.com/renpingsheng/p/7171950.html
关于python的复数
复数是由一个人实数和一个虚数构成的,表示为 x+yj
一个复数有一对有序的浮点数(x,y) ,x表示实数部分(横轴),y表示虚数部分(纵轴)
关于复数的概念:
1、虚数不能单独存在,反综合一个值为 0.0 的实数部分构成一个复数
2、复数有实数和虚数部分构成
3、表示虚数的语法:real + imagej
aa = 112-12j
print aa.real 实数部分 112.0
print aa.imag 虚数部分 -12.0
4、实数部分和虚数部分都是浮点数
5、虚数部分必须有后缀 j 或 J
内置属性:
复数对象拥有数据属性,分别为该复数的实部和虚部
复数还拥有 Conjugate 方法,调用它可以返回该复数的共轭复数对象
即:复数属性:real(复数的实部) imag(复数的虚部) conjugate() (返回共轭复数)
aa =112-12j
print(aa.conjugate()) # 112+12j
共轭复数: 两个实部相等,虚部互为相反数的复数互为共轭复数,(如果虚部为零,共轭复数就是其自身)
即: 112-12j 与112+12j 互为共轭复数 记做z(上面加一横) 或Z*