Python学习20问--2

1 一个模块只会被导入一次,不管你执行了多少次import

2 Python join()方法

  • Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
  • str.join(sequence) sequence – 要连接的元素序列。
  • 此方法需要sequence中的元素为str类型,若是其他类型如int需先进行转换。

3 python 文件操作

读文件:

  • 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的):
  • f = open(‘test.txt’, ‘r’) r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)
  • 如果文件不存在,open()函数就会抛出一个IOError的错误
  • 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源 f.close()
  • Python引入了with语句来自动帮我们调用close()方法:
    with open(’/path/to/file’, ‘r’) as f: print(f.read())
  • python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。
    • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
    • readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。
    • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。
    • 这三种方法是把每行末尾的’\n’也读进来了,它并不会默认的把’\n’去掉,需要我们手动去掉。

写文件:

  • 写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:
  • 'w’这个模式是酱紫:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用’a’这个模式。
  • 我们可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
  • 还是用with语句来得保险
  • 提供了两个“写”方法: write() 和 writelines()。
    • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
    • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。

4 OrderedDict

  • python中有个模块collections,里面自带了一个子类OrderedDict,实现了对字典对象中元素的排序。
  • OrderedDict对象的字典对象,如果其顺序不同那么Python也会把他们当做是两个不同的对象
  • 按key排序 kd = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
  • 按照value排序 vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))

5 exit()

  • exit(1) 表示发生了错误进行退出,而 exit(0) 则表示程序是正常退出的,退出代码是告诉解释器的(或操作系统)。
  • 无论exit()函数出现在程序中的何处,只要在程序执行过程中调用到exit()函数,程序立即终止程序。

6 python 内置常量

Python内置的常量不多,只有6个,分别是True、False、None、NotImplemented、Ellipsis、_debug_。

  1. True False
    • True False是bool类型用来表示真值的常量。
    • 对常量True False进行任何赋值操作都会抛出语法错误。
  2. None
    • None表示无,它是NoneType的唯一值。
    • 对常量None进行任何赋值操作都会抛出语法错误。
    • 对于函数,如果没有return语句,即相当于返回None。
  3. NotImplemented
    • NotImplemented是NotImplementedType类型的常量
    • 使用bool()函数进行测试可以发现,NotImplemented是一个真值。
    • NotImplemented不是一个绝对意义上的常量,因为他可以被赋值却不会抛出语法错误,我们也不应该去对其赋值,否则会影响程序的执行结果。
    • NotImplemented多用于一些二元特殊方法(比如_eq_、__lt__等)中做为返回值,表明没有实现方法
    • 而Python在结果返回NotImplemented时会聪明的交换二个参数进行另外的尝试。
  4. Ellipsis
    • Ellipsis是ellipsis类型的常量,它和…是等价的
    • 使用bool()函数进行测试可以发现,Ellipsis是一个真值
    • Ellipsis不是一个绝对意义上的常量,因为他可以被赋值却不会抛出语法错误,我们也不应该去对其赋值,否则会影响程序的执行结果。
  5. _debug_
    • __debug__是一个bool类型的常量。
    • 对常量__debug__进行任何赋值操作都会抛出语法错误。
    • 如果Python没有使用-O选项启动,此常量是真值,否则是假值。

7 二维数组与三维数组切片

超详细连接,讲的我是没咋看懂,不过可以参考一下,侵删

  • data[:,0] 列的切片,每行第一列的所有数据
  • data[:,1] 列的切片,每行第二列的所有数据
  • data[:,m:n] 列的切片,每行m到n-1列的所有数据

8 reshape

  • hape是查看数据有多少行多少列
  • reshape()是数组array中的方法,作用是将数据重新组织
  • reshape新生成数组和原数组公用一个内存,不管改变哪个都会互相影响。
  • 成的新形状中所包含的元素个数必须符合原来元素个数。如果数组元素发生变化的时候,就会报错
  • reshape(n,m) 转化成n行m列
  • reshape(n,-1) 转化成n行1列
  • reshape(-1,m) 转化成1行m列
  • reshape(-1,1) 转化成1列
  • reshape(1,-1) 转化成1行

9 Lambda

大佬连接,详细简单,请直接转,自己也直接转就行,侵删

  • Python中,lambda的语法是唯一的: lambda argument_list: expression
  • 这里的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的。
  • 这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。
  • 这里的lambda argument_list: expression表示的是一个函数。这个函数叫做lambda函数。
  • lambda函数有如下三个特性:
    • ambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
    • lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
    • lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
  • 四个用法:
    • 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
    • 将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
    • 将lambda函数作为其他函数的返回值,返回给调用者。
    • 将lambda函数作为参数传递给其他函数。
      部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。
      • filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来。
      • sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
      • map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。
      • reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: ‘{}, {}’.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是’1, 2, 3, 4, 5, 6, 7, 8, 9’。

10 yield

  • yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。
  • 这个生成器有一个函数:next(),这次next开始的地方是上次next结束的地方
  • 在 for 循环执行时,每次循环都会执行函数内部的代码,执行到 yield 时,函数就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
  • 当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。
  • 在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

11 global and nonlocal区别

大佬讲解,侵删

  • global 表示将变量声明为全局变量
  • global可以用在任何地方,即使之前未定义该变量
  • 被global修饰的变量直接标识为全局变量,但不影响函数中未被global修饰的同名变量(依然是局部变量)
  • nonlocal 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)。如果上一层函数中不存在该局部变量,nonlocal位置会发生错误。
  • nonlocal只能用在嵌套函数中,且外层函数定义了相应的局部变量。且该变量不能是global变量。
  • python引用变量的顺序如下:
    • 当前作用域局部变量
    • 外层作用域变量
    • 当前模块中的全局变量
    • python内置变量
  • python 在新建一个变量时,默认作用域为当前局部作用域。
    • 内部函数,不修改外层变量可以访问外层变量
    • 内部函数,修改同名外层变量,则python会认为是定义了一个新的局部变量,与外层变量无关了。
    • 在内部函数修改同名全局变量之前调用变量名称,则引发Unbound-LocalError
  • 只要在一个作用域中有 global 或者 nonlocal 命令,则不管这个命令在哪个位置,在整个作用域的开始到结尾都是有效的。
  • python不允许同一个局部作用域中的同一个变量名有多种角色,即不允许在 global a 这句话之前是局部变量、之后是全局变量。所以,尽管python是解释性语言、只有在执行时才会发现类型错误,但是并不代表后面的代码不会影响到前面的代码结果。

12 divmod

  • python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
  • 允许处理复数。

13 字符串

菜鸟教程

  • Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
  • Python 访问子字符串,可以使用方括号来截取字符串
  • 我们可以对字符串进行截取并与其他字符串进行连接
  • Python 中三引号可以将复杂的字符串进行赋值。Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
  • string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
  • string.isalpha() 如果string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
  • string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False.
  • string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False.
  • string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
  • string.isnumeric() 如果 string 中只包含数字字符,则返回 True,否则返回 False
  • string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False.
  • string.istitle() 如果 string 是标题化的(见 title())则返回 True,否则返回 False
  • string.isupper()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

14 deque

  • Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque
  • deque模块是python标准库collections中的一项,它提供了两端都可以操作的序列,双边队列。
  • 相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。
  • 在list的基础上增加了移动、增删、旋转等操作。
  • 所以deque更有优越性 而且deque既可以表示队列 又可以表示栈 实在是太方便了。
  • 方法
    • append:同list的append,在队尾加入一个元素
    • appendleft:在队首加入一个元素
    • clear:清空队列
    • copy:浅拷贝
    • count:a.count(1),a中1的数量
    • entend:参数是一个可迭代变量,在右端按照迭代顺序添加
    • extendleft:同上,不过是在左端按照迭代顺序添加
    • index:和list的相类似,用于找出某个值第一个匹配项的索引位置
    • insert:和list的相同,插入元素insert(index,obj),在index前插入元素,如果index超过长度就会插到最后,如果长度已经是最长,再插入会报错
    • maxlen:用于定义的时候使用,不是一个可以被writed的对象,形如a.maxlen=10会报错
    • pop:队尾元素删去
    • popleft:队头元素删去
    • remove:同list:用于移除列表中某个值的第一个匹配项。
    • reverse:倒序
    • rotate:循环移动,为正全体右移,为负全体左移

15 any

  • any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
  • 元素除了是 0、空、FALSE 外都算 TRUE。
  • any(iterable)

16 模块导入

更多内容看菜鸟教程

  • Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
  • 模块能定义函数,类和变量,模块里也能包含可执行的代码。
  • import 语句
    • import module1[, module2[,… moduleN]]
    • import ··· as ···
    • import urtlib.error
    • 当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
    • 一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
    • python建议每个导入语句单独成行
  • from…import 语句
    • Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中
    • from modname import name1[, name2[, … nameN]]
    • 把一个模块的所有内容全都导入到当前的命名空间也是可行的 from modname import *
    • 标准库中唯一推荐全盘导入的只有Tkinter
  • 相对导入
    • 。代表当前模块 。。代表上层模块
    • 为了避免偶然情况下导入标准库中模块产生冲突,PEP328建议相对导入层数不要超过两层
  • 可选导入
    • 如果希望优先使用某个模块或包,但同时也想在没有这个模块或包的情况下有备选
    • try – except
  • 局部导入
    • 当在局部作用域中导入模块时,执行的是局部导入
    • 很少用
    • 在文件顶部导入一个模块时,那么就是将其导入到全局作用域
    • 根据约定,所有的导入语句都应位于模块的顶部
  • 注意:
    • 循环导入。创建两个模块,二者互相导入对方,会报错
    • 覆盖导入。当创建的模块与标准库中的模块同名时,如果导入模块,会覆盖导入

搜索路径

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

17 python2 和python3的区别

  • print语句:Python 2中print是语句(statement),Python 3中print则变成了函数。在Python 3中调用print需要加上括号,不加括号会报SyntaxError

  • 整数相除:在Python 2中,3/2的结果是整数,在Python 3中,结果则是浮点数

  • Unicode:Python 2有两种字符串类型:str和unicode,Python 3中的字符串默认就是Unicode,Python 3中的str相当于Python 2中的unicode。

  • 在Python 2中,如果代码中包含非英文字符,需要在代码文件的最开始声明编码

    # -*- coding: utf-8 -*-
    

    在Python 3中,默认的字符串就是Unicode,就省去了这个麻烦,下面的代码在Python 3可以正常地运行

  • 异常处理:Python 3使用try语句时,必须使用as关键字。

  • xrange:Python 2中有 range 和 xrange 两个方法。其区别在于,range返回一个list,在被调用的时候即返回整个序列;xrange返回一个iterator,在每次循环中生成序列的下一个数字。Python 3中不再支持 xrange 方法,Python 3中的 range 方法就相当于 Python 2中的 xrange 方法。

  • map函数:在Python 2中,map函数返回list,而在Python 3中,map函数返回iterator。

  • 不支持has_key:Python 3中的字典不再支持has_key方法

  • 不等运算符:Python 2.x中不等于有两种写法 != 和 <>,Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

  • 数据类型:Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long。新增了bytes类型,对应于2.X版本的八位串

  • dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

  • 在python3.x中raw_input()和input( )进行了整合,去除了raw_input(),仅保留了input()函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

  • 首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数)。python3下:首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:

  • Python3 采用的是绝对路径的方式进行 import

  • Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,
    必须用新式类应用多重继承

  • Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所
    以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错

  • file 函数被 Python3 废弃,统一使用 open 来处理文件,

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

  • Python2,round 函数返回 float 类型值,Python3,round 函数返回 int 类型值

  • Python2 中任意两个对象都可以比较,Python3 中只有同一数据类型的对象可以比较

18 BIF

Python中的BIF就是Built-in Functions,即内置函数的意思,内置函数就是为了方便程序员快速的编写脚本程序,Python提供了很多内置函数,只需要直接调用即可。想要查看Python中的内置函数,在IDLE中输入dir(builtins)(注:builtins前后分别是两个下横杠)

19 字符编解码

部分转载于此问题答案,侵删

ASCII

  • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),是一种单字节编码。计算机起源于美国,早期计算机中使用的只有英文,没有其他的语言,而单字节可以表示2**8 -1即255个字符,可以表示所有的英文字符及许多控制符号。而且只用了一半。
  • 采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称”扩展字符集“。

GB2312

GB2312 是对 ASCII 的中文扩展。
把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。

GBK

GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

GB18030

后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字

每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

UNICODE,Unicode 是「字符集」

有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。

UNICODE传输,UTF-8

UTF-8 是「编码规则」
UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。UTF-8用1到6个字节编码Unicode字符。ASCII字符在utf-8编码格式中占用一个字节,汉子则占用三个字节。

20 Python 字符串前面加u,r,b,f的含义

  1. 字符串前加 u
    后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
  2. 字符串前加 r
    去掉反斜杠的转移机制。
    (特殊字符:即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。 )
  3. 字符串前加 b
    b" "前缀表示:后面字符串是bytes 类型
  4. 字符串前加 f python3.5以上就不支持这个功能了
    以 f开头表示在字符串内支持大括号内的python 表达式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值