一.赋值、浅拷贝和深拷贝的区别?
a = [1,2,"hello",['python', 'C++'],[1,2,3]]
b = a
赋值其实是对象的引用,a和b指向的是同一块内存,不会再创建一个新的内存空间或者对象。b只不过是a的别名 是引用,如果b修改了,a同样被修改。a修改 b同样也是
b is a 返回true
2. 浅拷贝
浅拷贝是重新创建了一个对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。对于可变数据类型 ,是复制了其引用 修改同步 但是不可变类型 int str等,没有被拷贝的说法 只是直接重新创建了一个新的,替换掉了
浅拷贝有三种形式:切片操作、工厂函数、copy 模块中的 copy 函数。 即常见的切片操作 就是浅拷贝 修改kei
切片操作:b = a[:3]
工厂函数: b = list(a)
copy 模块: b = copy.copy(a)
在这种情况下,列表 a 和 b 是不同的对象,修改列表 b 理论上不会影响到列表 a。 但是要注意的是,浅拷贝之所以称之为浅拷贝,是它仅仅只拷贝了一层,在列表 a 中有一个嵌套的 list,如果我们修改了它,情况就不一样了。 比如:a[3].append('java')。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌 套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地 址并未发生变化,指向的都是用一个位置。
a.append(3) 不影响b
a[2].append("abc") 影响b 并且b[2].append("abc") 也形象a
3. 深拷贝
重新创建一个对象 深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。全新的对象 和原来的没有任何关联
二、说明一下 os.path 和 sys.path 分别代表什么?(2018-3-30-lxy)
os.path 主要是用于对系统路径文件的操作。 sys.path 主要是对 Python 解释器的系统环境参数的操作(动态的改变 Python 解释器搜索路径)。
三。python中的作用域
本地作用域(Local)--->当前作用域被嵌入的本地作用域(Enclosing locals)--->全局/模块作用域 (Global)--->内置作用域(Built-in)。
四. 命名
函数名 小写加_ 特殊方法 :小写和两个前导下划线,两个后置下划线 这种风格只应用于特殊函数,比如操作符重载等。
类名 驼峰命名 首字母大写
模块名 小写不加_
变量名 小写加_
私有变量 前面_ + 名称 表示只有该类能访问 protected 但是其实外部也能范围
内置变量 内置变量 : 小写,两个前导下划线和两个后置下划线 __class__ 两个前导下划线会导致变量在解释期间被更名。变为类名.__class__ 这是为了避免配置变量与其他变量冲突 用户 定义的变量要严格避免这种风格。以免导致混乱。
五.Python 函数调用的时候参数的传递方式是值传递还是引用传递?
不可变类型 值传递
像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变 不可变对象
可变类型 引用传递
比如像列表,字典这样的对象是通过引用传递、和 C 语言里面的用指针传递数组很相似,可变对象 能在函数内部改变。
1. a = 10
2. b = 20
3. c = [a]
4. a = 15
print c 会输出10,对于字符串、数字,传递是相应的值。
六。正则表达式
match()函数只检测 RE 是不是在 string 的开始位置匹配,找不到返回none
search()会扫描整个 string 查找匹配; 也就是说 match()只有在 0 位置匹配成功的话才有返回, 如果不是开始位置匹配成功的话,match()就返回 none。
find() 在字符串中查找 找到返回字符串第一个位置的索引 找不到 返回-1
re.findall(r‘目的’,原有)
re.sub(r‘要替换原’,要替换新,原始)
Python 正则表达式 re findall 方法能够以列表的形式返回能匹配的子串
# print (help(re.findall))
# print (dir(re.findall))
findall查找全部r标识代表后面是正则的语句
正则 re.findall 的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组) 如有没有匹配到 返回[]
七。 math与decimal的使用
cmath
float
ceil
floor
up
down
round
八。 元组
元组 如果只有一个值 需要在后面加上逗号 42, 返回的就是一个元组 没加 就不是
tuple([1,2,3]) list 转元组(1,2,3)
tuple用法和list类似
不能拼接列表和字符串,虽然它们都是序列。一般而言,不能拼接不同类 型的序列。
[1,2,3]*10 [1,2,3,1,2,3,......,1,2,3] 循环10次 [None]*10 同理
加法的话 也是直接加在后面 不是数值相加
list 内置函数 max min len等 eg: max([1,2,3])
函数 append extend拼接 remove sort等 list_example = [1,2,3] list_example.sort(reverse=True) list_example.append([1,2,3]) [1,2,3,[1,2,3] ]extend [1,2,3,1,2,3]
多维数组的定义 或者使用生成器来辅助
list_two = [[0] * 3] * 3
九。字符串
字符串是不可变的,因此所有的元素赋值和切片赋值都是非 法的。
格式化字符串格式
其实也就是字符串的修改 可以使用位置方式 参数名方式等
字符串的 str.format()
方法需要更多的手动操作。你仍将使用 {
和 }
来标记变量将被替换的位置 其实就是填充符
'{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)
也可以设置参数
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
可以看到f-string最快,%
占位符次之,而str.format()
方法是最慢的。我们可以通过分析字节码来看一下这三种方法的内部实现。
https://cloud.tencent.com/developer/article/1197620
f-string模板字符串
f-string模板字符串是Python3.6之后版本的新特性,类似于str.format()方法,但是简洁了很多,在字符串前加f标记后可以直接直接解析大括号里的表达式,并且内部的实现方法也有不同,比str.format()方法快很多。
>>>name = 'Mike'
>>>age = 18
>>>f'{name} is {age + 1} years old.'
'Mike is 19 years old.'
%timeit '%d' %1
替换字段名
>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'
join作用与split相反 是一个连接的作用
方法translate与replace一样替换字符串的特定部分,但不同的是它只能进行单字符替换。 这个方法的优势在于能够同时替换多个字符,因此效率比replace高。
判断字符串是否满足特定的条件
很多字符串方法都以is打头,如isspace、isdigit和isupper,它们判断字符串是否具有特定 的性质(如包含的字符全为空白、数字或大写)。如果字符串具备特定的性质,这些方法就返回 True,否则返回False。
5.11 模块和包是什么?(2018-4-16-lxy)
在 Python 中,模块是搭建程序的一种方式。每一个 Python 代码文件都是一个模块,并可以引用 其他的模块,比如对象和属性。 一个包含许多 Python 代码的文件夹是一个包。一个包可以包含模块和子文件夹。
Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只 支持 unicode 的 string。
Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有 file.py,如 何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必 须使用绝对路径,否则只能使用相关导入的方式来进行导入