2018-06-10——python基础整理

Posted on 2018-06-11 15:26  古蓝  阅读(81)  评论(0)    收藏  举报

一、基础

http://www.cnblogs.com/jin-xin/articles/7459977.html

单双引号没有任何区别,只有在多行字符串的情况 需要考虑单双的配合,一般多行字符串必须用多引号。Eg:msg = "My name is Alex , I'm 22 years old!"

和c不同的是没有分号结尾

保存的后缀名单个文件无所谓,如果在程序中导入时必须为.py

#!/usr/bin/env python  //linux解释器路径

print (time.time() ) //输出当前时间

len(str)//获取str的字符个数,py3包括中文,2.7中要另外算

敲int、str、bool等,按住ctrl单机,会进入类型列表,真几把炫酷

可变类型:列表、字典

不可变类型:字符、数字、元祖

直接访问:数字 

顺序访问:字符、列表、元祖

映射:字典

文件的存储,传输不能是unicode编

s.encode(utf-8)//str(unicode)编码为utf-8bytes类型

bytes类型:s=b‘xxx’    不能是中文

小数据池:范围内的数字、字符串,创建时会共用一个内存地址

数字范围:-5~256

字符串范围:不能是特殊字符、单个字符s*20还是一个地址,21以后是两个

 *编码

python3默认编码utf-8(对Unicode编码的压缩和优化,将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节)

Unicode(最少两字节)

# -*- coding: utf-8 -*-//使用utf-8编码

*注释

单行注视:# 被注释内容

多行注释:""" 被注释内容 """

选中后ctrl + ? 整体注释 //感觉这个快捷键一点也不方便

*执行脚本导入参数

Python有大量的模块,从而使得开发Python程序非常简洁。类库有包括三中:

Python内部提供的模块

业内开源的模块

程序员自己开发的模块

Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数

*pyc文件

执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码。

ps:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码。

*变量

变量:把程序运行的中间结果临时的存在内存里,以便后续的代码调用。

Id(name)//查看name的内存位置

对于系统内部,变量名实际指向一个内存地址,

声明变量:name = “value”//声明一个变量,变量名为: name,值为:"value"

等于号也是赋值,如name1 = name name2 = “value2”

变量名只能是字母、数字或下划线的任意组合

变量名的第一个字符不能是数字

以下关键字不能声明为变量名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

变量的定义要具有可描述性。

推荐使用大小写数字结合,或结合下划线的方式定义变量

*常量

常量即指不变的量,如pai 3.141592653..., 或在程序运行过程中不会改变的量在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量

在c语言中就有相应的语法const来定义常量

*输入输出

输入:input(“****”)// ***为自定义输出字符串。一般赋值给变量,输入的都是字符串格式

输出:print(“*****”,name)// ***为自定义输出字符串,name为变量,其中用逗号分隔

输入:raw_input(‘*******’)

如果是输入密码,想要不可见,可利用getpass 模块中的 getpass方法输入:

getpass.getpass(“*********”)

*循环

Python中没有{},而是使用空格缩进或制表符来确立逻辑顺序。

break:退出当前循环执行循环下面的语句。

continue:退出当前循环继续下一次循环。

while 条件:

         循环体

Else:

**********

If

*****************

for item in value//按顺序将可迭代对象vlaue中的值赋给item并操作

         执行语句

*************************

for item item1 in enumerate(value,x)//同for,为可迭代的对象添加序号,从x开始,默认是0

         执行语句

**************************

range和xrange生成指定范围的数字

for i in range(1,10):

    print(i)

for i in range(1,10,2):  # 步长

    print(i)

for i in range(10,1,-2): # 反向步长

    print(i)

*格式化输出

类似于c的用法

%[(name)][flags][width].[precision]typecode

(name)      可选,用于选择指定的key

flags          可选,可供选择的值有:

+       右对齐;正数前加正好,负数前加负号;

-        左对齐;正数前无符号,负数前加负号;

空格    右对齐;正数前加空格,负数前加负号;

0        右对齐;正数前无符号,负数前加负号;用0填充空白处

width         可选,占有宽度

.precision   可选,小数点后保留的位数

typecode    必选

s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置

r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置

c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置

o,将整数转换成 八  进制表示,并将其格式化到指定位置

x,将整数转换成十六进制表示,并将其格式化到指定位置

d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置

e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)

E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)

f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)

F,同上

g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)

G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)

%,当字符串中存在格式化标志时,需要用 %%表示一个百分号

eg:name = “xxxxxxx:%s %d”%(name,age)

tpl = "i am %s" % "alex"

tpl = "i am %s age %d" % ("alex", 18)

tpl = "i am %(name)s age %(age)d" % {"name": "alex", "age": 18}

tpl = "percent %.2f" % 99.97623

tpl = "i am %(pp).2f" % {"pp": 123.425556, }

tpl = "i am %.2f %%" % {"pp": 123.425556, }

 

******************************

Format方式:[[fill]align][sign][#][0][width][,][.precision][type]

fill           【可选】空白处填充的字符

align        【可选】对齐方式(需配合width使用)

<,内容左对齐

>,内容右对齐(默认)

=,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字

^,内容居中

sign         【可选】有无符号数字

+,正号加正,负号加负;

 -,正号不变,负号加负;

空格 ,正号空格,负号加负;

#            【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示

,            【可选】为数字添加分隔符,如:1,000,000

width       【可选】格式化位所占宽度

.precision 【可选】小数位保留精度

type         【可选】格式化类型

传入” 字符串类型 “的参数

s,格式化字符串类型数据

空白,未指定类型,则默认是None,同s

传入“ 整数类型 ”的参数

b,将10进制整数自动转换成2进制表示然后格式化

c,将10进制整数自动转换为其对应的unicode字符

d,十进制整数

o,将10进制整数自动转换成8进制表示然后格式化;

x,将10进制整数自动转换成16进制表示然后格式化(小写x)

X,将10进制整数自动转换成16进制表示然后格式化(大写X)

传入“ 浮点型或小数类型 ”的参数

e, 转换为科学计数法(小写e)表示,然后格式化;

E, 转换为科学计数法(大写E)表示,然后格式化;

f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;

F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;

g, 自动在e和f中切换

G, 自动在E和F中切换

%,显示百分比(默认显示小数点后6位)

eg:tpl = "i am {}, age {}, {}".format("seven", 18, 'alex')

tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex'])

tpl = "i am {0}, age {1}, really {0}".format("seven", 18)

tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18])

tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)

tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})

tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])

tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)

tpl = "i am {:s}, age {:d}".format(*["seven", 18])

tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)

tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})

tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)

tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)

tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)

tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

*基本运算符

+:加法

-:减法

*:乘法

/:除法

**:x的y次幂

//:取商

%:取余数

***************************以上加个=号比如+=,即变成了赋值运算

==:比较是否相等

<>|!=:比较是否不相等

>|<|>=|<=:大于、小于、大于等于、小于等于

and、or、not:与或非

即优先级关系为( )>not>and>or,同一优先级从左往右计算。

x or y , x为真,返回x

x and y, x为真,返回y

 

sum([x,y,z…..])

*文件操作

#1. 打开文件,得到文件句柄并赋值给一个变量

f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

 

#2. 通过句柄对文件进行操作

data=f.read()

 

#3. 关闭文件

f.close()

使用with关键字来帮我们管理上下文,可不需要close

with open('a.txt','w') as f:

    pass

 

文件编码

f =open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

f=open('a.txt','r',encoding='utf-8')

 

文件的打开模式

     文件句柄 = open(‘文件路径’,‘模式’)

     #1. 打开文件的模式有(默认为文本模式):

r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

w,只写模式【不可读;不存在则创建;存在则清空内容】

a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

 

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)

rb

wb

ab

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

 

#3,‘+’模式(就是增加了一个功能)

r+, 读写【可读,可写】

w+,写读【可写,可读】

a+, 写读【可写,可读】

 

#4,以bytes类型操作的读写,写读,写读模式

r+b, 读写【可读,可写】

w+b,写读【可写,可读】

a+b, 写读【可写,可读】

 

文件操作方法

1. 文件打开方式为文本模式时,代表读取3个字符

2. 文件打开方式为b模式时,代表读取3个字节

其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

注意:

1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

3. 对文件进行for循环,是以行为单位进行的。

         def close(self, *args, **kwargs): # real signature unknown

        关闭文件

        pass

 

    def fileno(self, *args, **kwargs): # real signature unknown

        文件描述符 

        pass

 

    def flush(self, *args, **kwargs): # real signature unknown

        刷新文件内部缓冲区

        pass

 

    def isatty(self, *args, **kwargs): # real signature unknown

        判断文件是否是同意tty设备

        pass

 

    def read(self, *args, **kwargs): # real signature unknown

        读取指定字节数据

        pass

 

    def readable(self, *args, **kwargs): # real signature unknown

        是否可读

        pass

 

    def readline(self, *args, **kwargs): # real signature unknown

        仅读取一行数据

        pass

 

    def seek(self, *args, **kwargs): # real signature unknown

        指定文件中指针位置

        pass

 

    def seekable(self, *args, **kwargs): # real signature unknown

        指针是否可操作

        pass

 

    def tell(self, *args, **kwargs): # real signature unknown

        获取指针位置

        pass

 

    def truncate(self, *args, **kwargs): # real signature unknown

        截断数据,仅保留指定之前数据

        pass

 

    def writable(self, *args, **kwargs): # real signature unknown

        是否可写

        pass

 

    def write(self, *args, **kwargs): # real signature unknown

        写内容

        pass

f.seek (0)//调光标在字节位置

f.tell()//返回当前光标的字节位置

f.read(x)//读到x字符索引位置,默认-1 

f.readline()//读第x行,默认x为0

f.readlines()//以列表的形式读多行, 

f.truncate(x)//将源文件截取x位,也就是光标起始后x位,超出的会删除

文件的修改

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os  # 调用系统模块

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:

    data=read_f.read() #全部读入内存,如果文件很大,会很卡

    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')  #删除原文件

os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

 

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:

    for line in read_f:

        line=line.replace('alex','SB')

        write_f.write(line)

os.remove('a.txt')

os.rename('.a.txt.swap','a.txt')