Python知识点小结

Python知识点:

1、
python的函数

所有的对象都是通过引用来出传递的,函数也不例外。

函数参数传递,
直接给出数据时,参数按照预定义的顺序传递给相关形参,
当以关键字输入时,顺序就不重要了,解释器会自动匹配对应的形参关键字

函数中,关键字参数总是出现在形参之后,如int(x,base = 2)

任何能通过函数操作符“()”来调用的对象,都是“可调用的”

2、
lambda表达式
lambda [arg1[,arg2,…argN]]:expression

lambda可以生成函数对象,同时注意,lambda的函数体只能为单句表达式,甚至print语句都不行

例1:
def true():
return True
<===> lambda :True
例2:
def add(x, y):return x + y <====> lambda x,y:x+y

通过lambda来创建函数的对象,除了没有命名之外,享有和用户自定义函数相同的属性。
lambda的__name__属性被定义为字符串”

3、
内建函数
apply()

filter()

map()

reduce()

函数句点属性标识对于两个模块意味了不同的命名空间
foo.x ,bar.x

python有四种可调用对象:
函数,方法,类,以及一些类的实例

【注意】:可调用对象的任何引用或者别名都是可调用的。

只有内建类型(built-in type,BIT)有内建方法
内建方法和内建函数享有相同的属性,
不同之处在于BIM的__self__属性指向一个Python对象,而BIF指向None

4、
实例化,与类的调用
类,我们可以利用类的可调用性来创建实例。“调用”类的结果是创建了实例,也就是“实例化”

一般情况下,类的实例是不可被调用的,只有在类中实现了__call__()方法,类的实例才能成为可调用的。

5、exec()和eval()
一个很重要观点,exec和eval()都可以执行字符串格式的Python代码。
当执行字符串形式的代码时,每次都必须对这些代码进行字节编译处理

eval()对表达式求值,表达式可以为字符串或内建函数complie()创建的预编译代码对象。
eval()在执行时,可以理解为对字符串两边的引号视而不见
利用eval()可以将字符串转换为真正的Python对象
例如:eval(“2*3”) –> 6

exec与eval()相似,exec语句执行代码对象或字符串形式的Python代码(单一语句或多个语句组成的语句组)。
exec obj
注:多个语句作为一个字符串发给exec时,一般用”””引号。
exec还可以接受有效的Python文件对象。
例:
exec(“print ‘hello world.’”) —> hello world.
f = open(filename,’r’)
exec f #[注意]exec执行f之后,文件指针会移动到文件末尾EOF,再次执行时不会有任何效果,可以通过f.seek(0)移动文件指针至文件开始
f.close()

用compile()预编译重复代码有助于改善性能,因为调用时不必经过字节编译处理。

内建函数input()是eval()和raw_input()的组合,<==> eval(raw_input())

6、
执行其他(Python)程序

可以利用os模块调用外部程序

关于模块的导入,
注意:当导入模块时,解释器会执行模块中所有最高级别的(即没有缩进的)Python代码

如果有些代码不想被导入,那么就写在if name == ‘main‘语句中,
导入的副作用:导致最高级别代码运行。

将模块作为脚本执行
命令行中,Python -m 标准库中的模块

**14.5.3章节,与进程有关的一些说明。
**14.5.5章节,subprocess模块的常用方法用法介绍

shelve模块

shelve.open()方法
open(filename, flag=’c’, protocol=None, writeback=False)
Open a persistent dictionary for reading and writing.
filename文件名参数是一个数据库相关的基础文件名(不能是一个txt文件)
The filename parameter is the base filename for the underlying
database.


python文件操作

几个不太懂的词汇:

“钩子”

“句柄”

“文件描述符”

永久性存储
大部分永久性存储模块是用来存储字符串数据的
数据的序列化,扁平化,顺序化

“文件描述符”
形式:文件描述符是非负整数。
作用:内核(kernel)利用文件描述符(file descriptor)来访问文件,用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。

文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。
由于Linux的设计思想便是把一切设备都视作文件。

在Windows操作系统上,’文件描述符’被称作’文件句柄’。


1、相当于打开收音机
2、定于指定频道
3、接收信息(有两个方法,一个阻塞型的,另一个非阻塞型(新版本中才有,2.x版本没有))
4、发送方,指定频道并发送信息(数据)

注,接收一次后会断掉,如果想要不断地监听,最好写成一个循环,如:while True:后面是接收信息。

return True –> 可以用作条件判断时使用,return true时,if等条件语句为true

base64 模块的作用

command模块的作用


Python面试中常提到的内容:

一、爬虫
爬虫必要的几个基本需求:
1、抓取;
html看不懂(w3cschool学习,看懂各种标签的含义,要求能看懂html文件里的内容),http原理不懂(需要能看懂http请求头)
2、存储;
3、分析;
提取信息,
4、展示;

二、一般问题:
1、函数中设置全局变量
global
2、匿名函数
lambda x:xx

RE
3、Python中match()和search()区别
match(),只匹配开始位置
search(),扫描整个字符串并返回第一个成功的匹配
4、怎样查询并替换一个文本字符串?
sub()

异常;
try:
except

raise手动触发

pass语句
占位符

range()函数,

随机生成器
random

Python内存管理,是由Python解释器负责,不需要程序员关心

如何用Python来发送邮件
使用smtplib标准库

如何设置很多项目,不同版本
virtualenv

装饰器,
使用@decorator_name

你知道列表和元组之间的区别么?举个例子?
列表时可变对象
元组是不可变对象

with…as..
用于处理打开关闭文件

hasattr(a,b) –> a有b属性

if语句
if xxx:
if-statement
[else:xxx]

if条件表达式
result1 if xxx else result2
如果xxx为true,则result1,否则result2


符号的另外含义使用:

1、”+” : 连接操作符
除了用在数字加减,
还可以用于”序列+序列” ,–> 把两个序列组合成新的序列

2、”“ : 重复操作符
-序列
整数, —> 重复序列整数次


yield
生成器,

每次生成一个值的特殊函数

遇到yield,会返回yield生产出来的值,

可以调用yield生成器对象的next()方法

可以在for循环中使用生成器, for循环会创建一个生成器对象,并连续滴啊用其next()方法,获得值赋予for变量

python 的文件处理方法,
open()/file() 本身也是一个生成器
默认f = open(‘’,’r’) f本身也是一个生成器,默认一次读取一行


【linux】【expect】

expect是linux中一个,用于实现自动和交互式程序进行通讯,不需人工干预的工具

【pexpect】Python

expect的python封装,同样实现命令行进行自动交互,达到无需人工干涉自动化的目的

注:pexpect无法解析shell命令行中的 “>”,”|”和”*”(通配符),这三个特殊的元字符

解决:
    将有这三个特殊元字符的命令作为/bin/bash的参数进行调用:
例:
    child = pexpect.spawn("/bin/bash -c 'ls -l | grep LOG > log.txt'")
    child.expect(pexpect.EOF)
  或
    用python列表作为参数项
    shell_cmd = 'ls -l | grep LOG > log.txt'
    child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])  # 对我的启发,当直接写不容易的时候,多用变量进行传值
    child.expect(pexpect.EOF)

pexpect的几个核心组件 :spawn类,run函数, pxssh派生类

spawn 类 , # 作用,启动和控制子应用程序

【获取pexpect的输入和输出信息】
1、写到日志文件

child = pexpect.spawn('some_command')
fout = open('mylog.txt', 'w')
child.logfile = fout  # 

2、输出到标准输出STDOUT

child = pexpect.spawn('some_command')
child.logfile = sys.stdout

expect(pattern, timeout=-1, searchwindowsize=-1)

pattern 可以为一个list
若为list,则返回的结果是
子程序输出最先出现的那个元素,
或者是列表最左边的元素(索引最小的)

如果pexpect.EOF,pexpect.TIMEOUT作为expect的列表参数时,匹配时将返回所处列表中的索引ID

before;
after;

向子程序发送响应命令的方法s:
send(self, s) # 发送命令,不回车
sendline(self, s=””) # 发送命令, 回车
sendcontrol(self, char) # 发送控制字符,如child.sendcontrol(‘c’) 等价于”ctrl + c”
sendof() # 发送eof


判断是文件还是文件夹

1
2
3
4
5
6
7
8
9
import os
if os.path.isdir(path):
print "it's a directory"
elif os.path.isfile(path):
print "it's a normal file"
else:
print "it's a special file(socket,FIFO,device file)"


使用os模块可以获取指定文件夹下所有文件名,有两个方法os.walk()和os.listdir()

  1. os.listdir()

    注意:该方法会将目录下的一层文件和目录全部列出来,需要再结合上级路径判断哪些是文件,哪些是目录。

    1
    2
    3
    4
    5
    6
    7
    excel_files = os.listdir(files)
    for excel_f in excel_files:
    input_excel = os.path.join(files, excel_f)
    if os.path.isdir(input_excel):
    print input_excel + 'is a dir'
    else:
    print input_excel + 'is a file'

Python获取文件路径、文件名和扩展名

函数 作用 返回值
os.path.realpath(__file__) 获取当前文件绝对路径 字符串
os.path.dirname(__file__) 注意,这个函数仅能获取当前文件的上一级目录名,并不是所在父级路径 字符串
os.path.splitext() 分割文件名和扩展名 元组
os.path.split() 分割路径和文件名 元组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os

url = "http://images/logo.png"

(file, ext) = os.path.splitext(url)
print(file) # http://images/logo
print(ext) # .png

(path, filename) = os.path.split(url)
print(path) # http://images
print(filename) # logo.png


# /root/devops/export-zabbix/zabbix-export.py
# 上一级目录
file_path = os.path.dirname(__file__) # export-zabbix
# 文件路径
file_path = os.path.split(os.path.realpath(__file__))[0] # /root/devops/export-zabbix

python 创建目录

os.mkdir 创建单层目录

  • 类似于 Linux 命令: mkdir xxx

os.makedirs 递归创建目录

  • 类似于 Linux 命令:mkdir -p xxx

处理Python的编码问题

  1. python 文件包含中文

    1
    SyntaxError: Non-ASCII character '\xe4\xe5' in file xxxxx

    解决:在 python 文件开头添加文件编码注释

    1
    2
    3
    4
    5
    # -*- coding: utf-8 -*-

    或者

    # coding=utf-8
  2. 报错如下:typeerror decoding unicode is not supported

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    >>> unicode(u'foo', 'utf-8')

    Traceback (most recent call last):
    File "<pyshell#1>", line 1, in <module>
    unicode(u'foo', 'utf-8')
    TypeError: decoding Unicode is not supported

    从上面内容可知,已经是unicode的对象是无法用unicode()方法再编码的,

    可以利用下面方法将u'foo'编码为'utf-8'

    u'foo'.encode('utf-8')

    同时,在python程序中,通过方法返回的结果编码是unicode,那么不能再次调用unicode()方法

    样例1
    workbook = xlrd.open_workbook(excel_file)
    sheet_names = workbook.sheet_names()
    for worksheet_name in sheet_names:
    print worksheet_name √
    print unicode(worksheet_name,'utf-8') x

    样例2
    (pre_file, suffix_file) = os.path.splitext(base_naem)
    print unicode(pre_file, 'utf-8') √


  3. ```python
    unicodedecodeerror ‘ascii’ codec can’t decode byte 0xe6 in position 25:ordinal not in range(128)

    isinstance(aa, unicode) # 判断是否为unicode编码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

    > 在解决错误之前,首先要了解unicode和utf-8的区别。
    >
    > ​ unicode指的是万国码,是一种“字码表”。而utf-8是这种字码表储存的编码方法。unicode不一定要由utf-8这种方式编成bytecode储存,也可以使用utf-16,utf-7等其他方式。目前大多都以utf-8的方式来变成bytecode。
    >
    > ​ 其次,[**Python**](http://lib.csdn.net/base/11)中字符串类型分为byte string 和 unicode string两种。
    >
    > ​ 如果在python文件中指定编码方式为utf-8(#coding=utf-8),那么所有带中文的字符串都会被认为是utf-8编码的byte string(例如:mystr="你好"),但是在函数中所产生的字符串则被认为是unicode string。
    > ​ 问题就出在这边,unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就会产生这样的错误。例如:
    > ​ self.response.out.write("你好"+self.request.get("argu"))
    > ​ 其中,"你好"被认为是byte string,而self.request.get("argu")的返回值被认为是unicode string。由于预设的解码器是ascii,所以就不能识别中文byte string。然后就报错了。

    > 以下有两个解决方法:
    >
    > 1.将字符串全都转成byte string。
    > self.response.out.write("你好"+self.request.get("argu").encode("utf-8"))
    >
    > 2.将字符串全都转成unicode string。
    > self.response.out.write(u"你好"+self.request.get("argu"))
    > byte string转换成unicode string可以这样转unicode(unicodestring, "utf-8")

    更详细的内容查看 [stackoverflow上的这个回答](https://stackoverflow.com/questions/21129020/how-to-fix-unicodedecodeerror-ascii-codec-cant-decode-byte)



    ## 处理Pandas遇到的问题

    1. pandas从excel读取数据数字类型过长出现科学计数法的问题

    - 原因:excel显示数字时,如果数字大于12位就会自动转化为科学计数法。如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。所以本场景就是因为超过15位了,导致读取有问题,需要将数字类型转换位文本类型(str类型)

    - 解决:在excel读取的时候,添加`dtype=object`的参数 (也有人说添加dtype=str,可能由于版本问题,我没有成功)

    ```python
    pd.read_excel(excel_file, worksheet_name,index_col=None,dtype=object)

Python 计算百分比保留多位小数

两种方式,

  1. 格式化

    1. '%.2f' % x ,这里以保留两位小数为例
    2. '{:.2f}'.format(x)
  2. round函数

    • round(x, 2)

      注意,该函数会省略为0的数字,比如 round(10.00, 2) –> 10.0

计算百分比

同样是采用格式化,两种方法

  • 方法1,格式化为 float,然后处理 % 格式,需要计算 分子 / 分母 * 100
  • 方法2,直接使用参数格式化: {:.2%},这里为显示小数点后2位,

例如:

1
2
print '{:.2f}%'.format(42 / 50 * 100)
print '{:.2%}'.format(42 / 50 * 100)'

元组列表转为字典

1
2
3
4
5
6
7
8
tups = [("akash", 10), ("gaurav", 12), ("anand", 14), 
("suraj", 20), ("akhil", 25), ("ashish", 30)]
di = dict(tups)
print di

输出结果:
{'anand': 14, 'akash': 10, 'akhil': 25,
'suraj': 20, 'ashish': 30, 'gaurav': 12}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信