NWNU-Sun | 技术沉思录

代码是诗,bug是谜

   ::  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  75 随笔 :: 49 文章 :: 6 评论 :: 40664 阅读

1).Python运算符

1.Python算数运算符

描述:

image-20220527103853519

例子:

a = 21
b = 10
c = 0
c = a + b  #31
c = a - b  #11
c = a * b  #210
c = a / b  #2.1
c = a % b  #1
c = a ** b # 21^10 16679880978201
c = a // b #2

2.Python比较运算符

描述

image-20220527104941403

3.Python赋值运算符

image-20220527105550551

>>> a = 21
>>> b = 10
>>> c = 0
>>> c = a + b
>>> print(c)
31
>>> a+=b
>>> print(a)
31
>>> a-=b
>>> print(a)
21
>>> a*=b
>>> print(a)
210
>>> a/=b
>>> print(a)
21.0
>>> a%=b
>>> print(a)
1.0
>>> a**b
1.0
>>> a//b
0.0
>>>

4.Python位运算符

image-20220527110651774

a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0
 
c = a & b;        # 12 = 0000 1100
print "1 - c 的值为:", c
 
c = a | b;        # 61 = 0011 1101 
print "2 - c 的值为:", c
 
c = a ^ b;        # 49 = 0011 0001
print "3 - c 的值为:", c
 
c = ~a;           # -61 = 1100 0011
print "4 - c 的值为:", c
 
c = a << 2;       # 240 = 1111 0000
print "5 - c 的值为:", c
 
c = a >> 2;       # 15 = 0000 1111
print "6 - c 的值为:", c

5.Python逻辑运算符

image-20220527111745636

   a = 1
    b = 0
    if a and b:
        print("变量a和b都为true")
    else:
        print("变量a和b至少一个为false")

    if a or b:
        print("a和b当中有至少一个为true")
    else:
        print("a和b都为false")

    if not(a and b):
        print("a和b当中至少有一为false")

    else:
        print("a和b都为true")

6.Python成员运算符

a in b 判断a是否在b中

if ( a in list ):
   print "1 - 变量 a 在给定的列表中 list 中"
else:
   print "1 - 变量 a 不在给定的列表中 list 中"

7.Python身份运算符

身份运算符用于比较两个对象的存储单元

image-20220527112948277

>>> id(d)
2797830932560
>>> a = 10
>>> b = 10
>>> id(a)
2797830930960
>>> id(b)
2797830930960
>>>

is 与 == 区别:

is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。

8.Python运算符优先级

image-20220527113200891

2). Python条件语句

if 判断条件:
    执行语句……
else:
    执行语句……
 num = 5
    if num > 5:
        print(">5")
    elif num == 4:
        print("=4")
    elif num < 4 & num >1:
        print("<4")
    else:
        print("=5")
   if num > 5: print(">5")

3).Python While 循环语句

while 判断条件(condition):
    执行语句(statements)……

例子:

    while len(numbers) > 0:
        a = numbers.pop()
        if a % 2 == 0:
            list1.append(a)
        else:
            list2.append(a)
    print(list1)
    print(list2)

无限循环

如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例:

var = 1
    while var == 1:
        var1 = input("enter a number:")
        print("you entered:",var1)
    print("good bye")

循环使用 else 语句

   count = 0
    while count < 5:
        print("count:",count)
        count = count + 1
    else:
        print("conunt >= 5")

4).Python for 循环语句

for iterating_var in sequence:
   statements(s)
    str = "helloworld" #遍历字符串
    str1 = [3,5,1,2,4,8] #遍历列表
    str2 = ("this","is","python") #遍历元组
    str3 = {"name":"zhangsan","age":19} #遍历字典 只会遍历key
    for x in str3:
        print(x)

通过序列索引迭代

   str1 = [3,5,1,2,4,8] #遍历列表
   for y in range(len(str1)):
        print(str1[y])

循环使用 else 语句

    for num in range(10, 20):
        for y in range(2, num):
            if num % y == 0:
                z = num / y
                print('%d = % d * %d' % (num, y, z))
                break
        else:
            print('%d is 质数' % num)

5).Python 循环嵌套

Python for 循环嵌套语法:

for iterating_var in sequence:
   for iterating_var in sequence:
      statements(s)
   statements(s)

Python while 循环嵌套语法:

while expression:
   while expression:
      statement(s)
   statement(s)

6).Python break 语句

Python break语句,就像在C语言中,打破了最小封闭for或while循环。

break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。

break语句用在while和for循环中。

如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。

7).Python continue 语句

Python continue 语句跳出本次循环,而break跳出整个循环。

continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。

continue语句用在while和for循环中。

    a = 'hello,python'
    for x in a:
        if x == 'o':
            continue
        print(x)
   var = 10
    while var > 0:
        var = var - 1
        if var == 5:
            continue
        print(var)

8).Python Number(数字)

Python Number 数据类型用于存储数值。

数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。

以下实例在变量赋值时 Number 对象将被创建:

var1 = 1
var2 = 2

使用del语句删除一些数字的引用

del var1 var2

del删除多个对象

del var1,var2

1. 四种不同的数值类型

int 1 2

long 10L #长整型也可以使用小写"L",但是还是建议您使用大写"L",避免与数字"1"混淆。Python使用"L"来显示长整型

float 12.12

complex 3+26J #Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型

2.Python Number 类型转换

int(x [,base ])         将x转换为一个整数  
long(x [,base ])        将x转换为一个长整数  
float(x )               将x转换到一个浮点数  
complex(real [,imag ])  创建一个复数  
str(x )                 将对象 x 转换为字符串  
repr(x )                将对象 x 转换为表达式字符串  
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象  
tuple(s )               将序列 s 转换为一个元组  
list(s )                将序列 s 转换为一个列表  
chr(x )                 将一个整数转换为一个字符  
unichr(x )              将一个整数转换为Unicode字符  
ord(x )                 将一个字符转换为它的整数值  
hex(x )                 将一个整数转换为一个十六进制字符串  
oct(x )                 将一个整数转换为一个八进制字符串  

3.Python随机数函数

image-20220527161813053

import random
random.choice(seq) #seq可以试字符串、列表、元组
random.randrange ([start,] stop [,step]) ## 从start 到 stop ,步长为2
random.random() # 返回0-1之间的值
random.shuffle(lst) #将lst随机排序
random.uniform(x, y) #生成一个x-y之间的实数  
int(random.uniform(x,y)) # 可以做如下修改,改为整数

9).Python 字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号 ( '" ) 来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

var1 = 'python'
var2 = "python2"

访问字符串的值

var1 = 'Hello World!'
var2 = "Python Runoob"
 
print "var1[0]: ", var1[0]
print "var2[1:5]: ", var2[1:5]

Python 字符串连接

Python字符串运算符

+ 字符串连接
* 重复输出
[] 通过索引获取字符串字符
[:] 截取字符串的一部分
in 成员运算符  
not in 如果字符串不包含在给定的字符中
r/R 原始字符串  没有不能打印的字符
% 格式化字符串
>>> var1 = 'python'
>>> var2 = var1 + "666"
>>> var2
'python666'
>>> var1 * 2
'pythonpython'
>>> var1[1]
'y'
>>> var1[1:]
'ython'
>>> 'p' in var1
True
>>> 'p' not in var1
False
>>> print(r'\n\t\z')
\n\t\z
>>>

Python 字符串格式化

基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

print "My name is %s and weight is %d kg!" % ('Zara', 21) 

Python 三引号

Python 中三引号可以将复杂的字符串进行赋值。

Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。

>>> h = '''ahsia
... asasa
... asa'''
>>> print(h)
ahsia
asasa
asa
>>>

python的字符串内建函数

10). Python 列表(List)

列表的数据项不需要具有相同的类型

序列都可以进行的操作包括索引,切片,加,乘,检查成员

Python已经内置确定序列的长度以及确定最大和最小的元素的方法

list = [1,2,3,'a','4','test']

访问列表中的值

list1 = list[0] 
list1 = list[5:]

更新列表

可以使用append()方法来添加列表项

list = [] #空列表
list.append('good') #添加元素

删除列元素

var = [1,2,'python'] #定义一个列表
del var #删除列表
del var1,var2 #删除多个列表
del var[2] #删除列表中第三个元素

列表脚本操作符

len(a) # a可以试字符串、列表、元组、字典
3 in[2,3,4]  #3存在的话,返回True

列表截取

a = ['java','python','c++']
      0       1       2
      -3       -2      -1
a[0] 和a[-3] 取到的值为 ’java‘

#截取
a[1:]  # 取下标为1到最后

列表中的函数和方法

序号 函数
1 cmp(list1, list2) 比较两个列表的元素
2 len(list) 列表元素个数
3 max(list) 返回列表元素最大值
4 min(list) 返回列表元素最小值
5 list(seq) 将元组转换为列表
1 list.append(obj) 在列表末尾添加新的对象
2 list.count(obj) 统计某个元素在列表中出现的次数
3 list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj) 将对象插入列表
6 [list.pop(index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7 list.remove(obj) 移除列表中某个值的第一个匹配项
8 list.reverse() 反向列表中元素
9 list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序

11).Python元组

元组与列表类似,不同之处在于元组的元素不能修改

元组用’( )‘ ,列表用’[ ]‘

定义:

创建空元组
tup1 = ()
tup1 = (50,)  #插入一个元素时,需要在元素后面添加逗号

访问元组:

和字符串类似,下标索引从0开始,可以进行截取,组合等

实例:

tupe1 = ('hello','python','china')
print(tuple1[1])  # 'python'
print(yuple1[1:])  # ['python' 'china']

修改元组:

由于元组不可修改,所以只能进行组合操作

a = (1,2,3)
b = (4,5,6)
c = a + b  # (1,2,3,4,5,6)  创建一个新的元组

元组运算符:

len((1,2,3))
(1,2,3) + (4,5,6)
('hi') * 3 
3 in (1,2,3)
for x in (1,2,3): print(x)

元组索引,截取

L = ('spam', 'Spam', 'SPAM!')
Python 表达式 结果 描述
L[2] 'SPAM!' 读取第三个元素
L[-2] 'Spam' 反向读取,读取倒数第二个元素
L[1:] ('Spam', 'SPAM!') 截取元素

元组内置函数

1 cmp(tuple1, tuple2) 比较两个元组元素。
2 len(tuple) 计算元组元素个数。
3 max(tuple) 返回元组中元素最大值。
4 min(tuple) 返回元组中元素最小值。
5 tuple(seq) 将列表转换为元组。

12).Python字典

  • 可存储任意类型对象
  • 采用key:value 对,用冒号分隔
  • 键是唯一的,如果重复,最后一个键的值会替换前面的,值不需要唯一

定义:

d = {key1:value1,key2:value2}

访问字典的值

tinydict= {'name':'zhangsan','age':12,'class':'math'}
print(tinydict['name'])

修改:

向字典添加新的键值对,修改或者删除已有的键值对

tinydict= {'name':'zhangsan','age':12,'class':'math'}
tinydict['name']='lisi'
tinydict['score']=99

删除字典元素

del tinydict #清空字典

del tinydict['name'] #删除元素

字典的特效

key 唯一,否则取最后一个

键必须不可变,所以可以用数字、字符串或元组充当,用列表不行,(列表的元素可变)

d = {['name']:'zhangsan'}  #key为列表  错误
d = {('name'):'zhangsan'}  #key为元组
d['naem']

字典内置函数&方法

1 cmp(dict1, dict2) 比较两个字典元素。
2 len(dict) 计算字典元素个数,即键的总数。
3 str(dict) 输出字典可打印的字符串表示。
4 type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。
  • dict.clear() 清空字典所有元素

  • dict.copy() 返回一个字典的浅复制

浅拷贝 :相当于做了一个引用

深拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用

  • dict.items() 返回可遍历的元组数组

13).Python 日期和时间

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间

例子:

import time
ticks = time.time()  
print('当前时间戳:',ticks)

时间元组

很多Python函数用一个元组装起来的9组数字处理时间:

上述也就是struct_time元组。这种结构具有如下属性:

0 tm_year 2008
1 tm_mon 1 到 12
2 tm_mday 1 到 31
3 tm_hour 0 到 23
4 tm_min 0 到 59
5 tm_sec 0 到 61 (60或61 是闰秒)
6 tm_wday 0到6 (0是周一)
7 tm_yday 1 到 366(儒略历)
8 tm_isdst -1, 0, 1, -1是决定是否为夏令时的旗帜

获取当前时间

import time
localtime=time.localtime(time.time())  # localtime(‘时间’)  传入一个时间戳
localtime=time.localtime()  #获取当前的时间
print(localtime)

格式化时间

我们可以使用 time 模块的 strftime 方法来格式化日期

time.strftime(format[,t])

import time
time1 = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
'2022-05-28 18:21:16'

获取某月日历 calendar模块

import calendar
cal = calender.month(2016,1)

14).Python函数

函数的定义:

def 函数名(参数):
	内容
	return [表达式]
  • return [表达式]** 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

函数调用

# 定义函数
def printme( str ):
   "打印任何传入的字符串"
   print str
   return
 
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")

参数传递

在 python 中,类型属于对象,变量是没有类型的

a=[1,2,3]
 
a="Runoob"

以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象

不可变类型:数字、strin、元组

a = 5
a = 10 
这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a
str = [1,2,3]

可变类型:列表、字典

将列表的第二个元素更改为2.2
str = [1,2,3]
str[1]=2.2 
修改年龄为90
dit = {'name':'zhangsan','age':16}
dit['age']=90

python函数的参数传递:

  • 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
def fun(a):
	a=10
b=2
fun(b)
print(b)  #结果为2
  • 可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
def fun(a):
	a.append([1,2,3])
	print(a) #函数内  [12, 13, 14, [1, 2, 3]]
b = [12,13,14]
fun(b)
print(b) #函数外  [12, 13, 14, [1, 2, 3]]

必备参数:函数定义需要传参数时,调用时必须填写

def fun(str):
	print(str)

fun(str)

关键字参数:

def fun(name):
	print(name)
	
fun(name='zhangsan')

默认参数:

def fun(name,age=12):
	print(name,age)

fun(name='zhangsan',age=30)  # zhangsan 30
fun(name='zhangsan') #zhangsan 12

不定长参数:

加了星号(*)的变量名会存放所有未命名的变量参数

def fun(name,*techang):
	print(name)
	for x in techang:
		print(x)
	return
#调用
fun('张三','乒乓球','羽毛球','篮球')

匿名函数:

python 使用 lambda 来创建匿名函数。

sum = lambda x,y:x+y
print(sum(1,2))

变量作用域

局部变量

全局变量

15).Python模块

模块的定义:(类似Java的类文件,但是Java除了定义Package,需要创建对象来使用,Python直接import导入)

support.py 

def qiuhe(a,b):
    return a + b

模块的使用:import语句

import support

c = qiuhe(1,2)
print(c) #3

from…import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下

from fib import fibonacci

from…import* 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明

from modname import *

模块的搜索路径

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

命令空间和作用域

一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样

global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

Money = 2000
def AddMoney():
   # 想改正代码就取消以下注释:
   # global Money
   Money = Money + 1
 
print Money
AddMoney()
print Money

dir()函数

dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字

#导入内置的math模块
import math
content = dir(math)
print content

reload()函数

当一个模块被导入到一个脚本,模块顶部的代码只会被执行一个

如果想重新执行模块顶部的代码,可以用reload()函数

reload(module_name)

Python中的包

包就是文件夹,该文件夹下必须存在__init__.py文件,可以为空,用于标识当前文件为包

test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py

如何调用,在 package_runoob 同级目录下创建 test.py 来调用 package_runoob

from package_ruuoob.runppb1 import runoob1
from package_runoob.runoob2 import runoob2

runoob1()
runoob2()

16).Python文件IO

读取键盘输入

raw_input

input

打开和关闭

file.open(file_name,access_mode,buffering)

  • file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
  • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
模式 r r+ w w+ a a+
+ + + +
+ + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +

File对象的属性

属性 描述
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。

close()方法

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

write()方法

write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

write()方法不会在字符串的结尾添加换行符('\n'):

read()方法

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

语法:

fileObject.read([count])

在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。

文件定位

file.tell() 当前读取的文件位置

file.seek(offset,from) offset 要移动的字节数 from 从那个位置开始

1 :当前位置

0:从头开始

2: 从末尾开始

重命名和删除文件 os模块

os.rename(current_file_name, new_file_name)
import os
os.rename('test1.txt','test2.txt')

remove()方法

os.remove(file_name)

Python里的目录

os,mkdir('newdir') #创建目录

os.chdir('newdir') #改变当前目录

os.rmdir() #删除目录 ,删除钱,内容应该被清除

文件、目录相关的方法

os 提供了处理文件及目录的一系列方法

file 对象提供了操作文件的一系列方法

17).Python File(文件) 方法

open() 方法

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file,mode='r')

完整的语法格式为

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符

mode 参数有:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

默认为文本模式,如果要以二进制模式打开,加上 b

file 对象

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

序号 方法及描述
1 file.close()关闭文件。关闭后文件不能再进行读写操作。
2 file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3 file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4 file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
5 file.next()返回文件下一行。
6 [file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。
7 [file.readline(size])读取整行,包括 "\n" 字符。
8 [file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
9 [file.seek(offset, whence])设置文件当前位置
10 file.tell()返回文件当前位置。
11 [file.truncate(size])截取文件,截取的字节通过size指定,默认为当前文件位置。
12 file.write(str)将字符串写入文件,返回的是写入的字符长度。
13 file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

18).Python异常处理

异常处理

断言

python标准异常

异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类

异常处理

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

例子:

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

使用except而不带任何异常类型

你可以不带任何异常类型使用except,如下实例:

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。

使用except而带多种异常类型

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

异常的参数

一个异常可以带上参数,可作为输出的异常信息参数。

你可以通过except语句来捕获异常的参数,如下所示:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

触发异常

可以使用raise语句自己触发异常

格式如下:

raise [exception,args]

例子

def fun(level):
	if level < 1:
		raise Exception("Invaild level!",level)
		#触发异常后,后面的代码就不会执行了

注意:为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串

try:
    正常逻辑
except Exception,err:
    触发自定义异常    
else:
    其余代码

例子:

# 定义函数
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # 触发异常后,后面的代码就不会再执行
try:
    mye(0)            # 触发异常
except Exception,err:
    print 1,err
else:
    print 2

用户自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。

以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。

在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

在你定义以上类后,你可以触发该异常,如下所示:

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args

19).Python OS 文件/目录方法

os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

例子

os.access(path,mode)

path:检测是否有访问权限的路径

mode:

    • os.F_OK: 作为access()的mode参数,测试path是否存在。
    • os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
    • os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
    • os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。

返回值

如果允许访问返回 True , 否则返回False。

序号 方法及描述
1 os.access(path, mode) 检验权限模式
2 os.chdir(path) 改变当前工作目录
3 os.chflags(path, flags) 设置路径的标记为数字标记。
4 os.chmod(path, mode) 更改权限
5 os.chown(path, uid, gid) 更改文件所有者

20).Python 内置函数

21).Python面向对象

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

创建类

使用class语句创建一个新类

class ClassName:
	'类的帮助信息'
	class_suite #类体

实例:

class Employee:
	empCount=0
	def __init__(self,name,age):
		self.name=name
		self.age=age
		Employee.empCount+=1
		
	def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
    def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ",  			  self.salary
  • empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
  • 第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
  • self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self代表类的实例,而非类

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

以上输出:

<__main__.Test instance at 0x10d066878>
__main__.Test

self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的

创建实例对象

没有Java类似的new关键字

采用函数调用的方式创建实例

class Employee:
    empCount = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.empCount += 1

    def displayCount(self):
        print("name %d" % Employee.name)

    def displayEmployee(self):
        print("Name : ", self.name, ", age: ", self.age)

e = Employee('zhangsan',18)
e.displayEmployee()
print(e.empCount)

可以添加、删除、修改类的属性

e.name='李四'
e.age=99

del e.age

还可以使用一下函数的方式来访问属性

hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(emp1, 'age')    # 删除属性 'age'

Python内置类属性

  • dict_ : 类的属性(包含一个字典,由类的数据属性组成)
  • doc :类的文档字符串
  • name: 类名
  • module: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
  • bases : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

image-20220530104322982

python对象销毁(垃圾回收)

引用计数器 :通过记录所有使用的对象各有多少引用,当某个对象引用数为0时,回收

循环引用

两个对象相互引用,但是没有其他变量引用

析构函数 del ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行

class Employee:
    '所有员工的基类'
    empCount = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.empCount += 1

    def displayEmployee(self):
        print("Name : ", self.name, ", age: ", self.age)

    def __del__(self):
        claName=self.__class__.__name__
        print('销毁对象',claName)

e = Employee('张三',19)
print(e.displayEmployee())

输出

Name :  张三 , age:  19
None
销毁对象 Employee

类的继承

通过继承创建的新类称为子类派生类,被继承的类称为基类父类超类

class Father

class Son(Father)

多继承

class A:        # 定义类 A
.....

class B:         # 定义类 B
.....

class C(A, B):   # 继承类 AB

重写父类的方法

lass Parent:        # 定义父类
   def myMethod(self):
      print '调用父类方法'
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print '调用子类方法'
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

基础重载方法

下表列出了一些通用的功能,你可以在自己的类重写:

序号 方法, 描述 & 简单的调用
1 init ( self [,args...] ) 构造函数 简单的调用方法: obj = className(args)
2 del( self ) 析构方法, 删除一个对象 简单的调用方法 : del obj
3 repr( self ) 转化为供解释器读取的形式 简单的调用方法 : repr(obj)
4 str( self ) 用于将值转化为适于人阅读的形式 简单的调用方法 : str(obj)
5 cmp ( self, x ) 对象比较 简单的调用方法 : cmp(obj, x)

类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

类的方法

在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods

单下划线、双下划线、头尾双下划线说明:

  • foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
posted on   匿名者nwnu  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示