Python学习记录(让你从白中白到简单入门)

目录

显式类型转换

数据结构(序列结构)

1. 序列(序列是 Python 中最基本的数据结构)——中括号[]

提示:

2.元组(Python 的元组与列表类似,不同之处在于元组的元素不能修改)——小括号(),一般就直接用','隔开

提示:

3.字典(字典是另一种可变容器模型,且可存储任意类型对象)——大括号{}

提示:

4.集合(集合(set)是一个无序的不重复元素序列)——大括号{}

提示:

补充:递推式

一些相关函数使用示例(add)

斐波那契数实例(循环结构操作):

end关键字的使用:

条件语句if – elif – else:

循环语句(此处使用for示例,while在上面已经说过了)

迭代器:

生成器 :

 函数

1.基本语法:

2.实例及函数调用的介绍:

3.参数的传递:

 4.正式的参数类型:

 5.匿名函数:Python 使用 lambda 来创建匿名函数

 6.return语句的使用:语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None

7.强制位置参数(这个是3.8新增的)

8. eval()函数的用法:

数据结构

1.堆栈 :append()   pop()

2.队列:

3.列表推导式见上:

4.del语句的使用 :

5. 遍历技巧

模块

模块导入的方法:

包:管理 Python 模块命名空间的形式(类似与模块写函数)

输入和输出

输出:

关于.format前 {}使用的几种情况

输入

相关的库:pickle模块

A.pickle.dump(obj, file, [,protocol]) 

B. pickle.load(file)

C.  pickle.dumps(obj[, protocol])&&pickle.loads(file)

Python file

打开(返回)文件对象的方法:open(filename[,mode])

file 对象常用的函数 (上面出现的此处无)

1. file.flush():方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入

2. fileno():返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作

3. file.isatty():检测文件是否连接到一个终端设备,如果是返回 True,否则返回 Fals

4. file.seek():用于移动文件读取指针到指定位置

5. file.tell():返回文件的当前位置,即文件指针当前位置

6. file.truncate():用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小



#python 是面向对象的语言
#第一个字符必须是字母表中字母或下划线 _ 
#标识符的其他的部分由字母、数字和下划线组成
#标识符对大小写敏感。
#Python语句的先后是根据段前句决定,使用在编写Python代码时,一定注意
#本博客中的源码可能存在层级问题,自行调整即可



显式类型转换

1.int() 强制转换为整型

2.float()强制转换为浮点型

3.str() 强制转换为字符串类型

示例:

num_str='123'#这是一个字符型的变量
num_str = int(num_str)    # 强制转换为整型
print("类型转换后,num_str 数据类型为:",type(num_str))#使用type()可以查看变量类型

数据结构(序列结构)

1. 序列(序列是 Python 中最基本的数据结构)——中括号[]

   创建示例:


list1 = ['Google', 'Runoob', 1997, 2000]#可以存在不同的数据结构
list2 = [1, 2, 3, 4, 5 ]#基本格式就是中括号括起来,逗号分开
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']

序列中的索引:

  • 与字符串的索引一样,列表索引从 0 开始,第二个索引是 1,依此类推
list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )#第一个值
print( list[1] )#第二给值

  • 索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推
list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )#倒数第一个数
print( list[-2] )#倒数第二个数
  • 可以实现多个数的访问(正反索引)

示例:

nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]#正向示例
print(nums[0:4])#基本的格式就是括起来 第一个值(包括):停止的值(不包含)

list = ['Google', 'Runoob', "Zhihu", "Taobao", "Wiki"]#反向示例
print (list[1:-2])#从第一个数到倒数第二个数(不包括倒数第二个数)
  • 通过索引列表可以进行截取组合等操作

更新列表:

list = ['Google', 'Runoob', 1997, 2000]
list[2] = 2001#直接赋值修改即可

增添值:

#list.append(value)
list1 = ['Google', 'Runoob', 'Taobao']#在列表末尾增加元素
list1.append('Baidu')#需要添加值的list.append(值)

删除值:

#del list[索引]
list = ['Google', 'Runoob', 1997, 2000]
del list[2]#直接使用del 需要删除的那个值的索引

统计某个元素在列表中出现的次数:

#list.count(value)
aList = [123, 'Google', 'Runoob', 'Taobao', 123]
print ("123 元素个数 : ", aList.count(123))#统计其(123)个数
print ("Runoob 元素个数 : ", aList.count('Runoob'))#统计('Runoob')个数

在列表末尾一次性追加另一个序列中的多个值:

#list.extend(seq)
list1 = ['Google', 'Runoob', 'Taobao']
list2=list(range(5)) # 创建 0-4 的列表
language_tuple = ('Spanish', 'Portuguese')#这是一个元组
list1.extend(list2)  # 用列表扩展列表
list1.extend(language_tuple)#用元组扩展列表

从列表中找出某个值第一个匹配项的索引位置:

#list.index(value)
list1 = ['Google', 'Runoob', 'Taobao']
print (list1.index('Runoob'))#输出1

函数用于将指定对象插入列表的指定位置:

#list.insert(index, obj)
list1 = ['Google', 'Runoob', 'Taobao']
list1.insert(1, 'Baidu')#将字符'Baidu'嵌入到原索引1的位置

pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值:

#list.pop([index=-1])
#pop()
#index里面默认最后一个(-1),可以通过直接修改索引

list1 = ['Google', 'Runoob', 'Taobao']
list1.pop()#默认移除最后一个
list1.pop(1)#移除第二个

移除列表中某个值的第一个匹配项:

#list.remove(obj)
list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list1.remove('Taobao')#指定移除字符'Taobao'

反向列表中元素:

#list.reverse()
list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list1.reverse()#实现反向

清除列表:

#list.clear()
list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list1.clear()#清楚整个列表的值,仍然可以输出这个列表,但是没值

复制列表:

#list.copy()
list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list2 = list1.copy()#将list1的值全部copy to list2

对原列表进行排序:

#list.sort( key=None, reverse=False)
#key=particular value(比较对象,默认为none)
#reverse=False/Ture
#False是默认的升序,Ture是降序
#key我不会
vowels = ['e', 'a', 'u', 'o', 'i']
vowels.sort(reverse=True)#降序输出

有关列表的其他Python包含的函数:

len(list)#求列表中元素的个数

max(list)#返回列表最大值

min(list)#返回列表最小值

list(seq)#将 元素列表转换为列表(list)    tips:元组和列表很像,就是里面的值不能像列表一样修改

提示:

  1. 列表可以拼接'+';
  2. 也可以嵌套(即使用内列表当作外列表的值)
  3. seq -- 元素列表,可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。

    2.元组(Python 的元组与列表类似,不同之处在于元组的元素不能修改)——小括号(),一般就直接用','隔开

创建示例(Tuple):

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"   #  不需要括号也可以

删除元组:

#del Tuple
tup = ('Google', 'Runoob', 1997, 2000)
del tup#删除整个Tuple

判断元组里的元素存在:

#a particular value in Tuple
3 in (1, 2, 3)

迭代:

for x in (1, 2, 3): 
    print (x, end=" ")

提示:

  • 元组由若干逗号分隔的值组成
  • 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用(会被误认为整型,而不是元组)
  • 元组可以使用下标索引来访问元组中的值(和list一样)
  • 元组中的元素值是不允许修改的,但是可以合并(使用'+')
  • 元组的复制   {('Hi!',) * 4}
  • 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
  • len(Tuple)输出元素个数(与list相同)
  • min(tuple),max(tuple)

    3.字典(字典是另一种可变容器模型,且可存储任意类型对象)——大括号{}

基本格式:

d = {key1 : value1, key2 : value2, key3 : value3 }
#key必须是唯一的
#value可以相同

访问字典内部的值:

tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print (tinydict['Name'])#大括号内写key
print (tinydict['Age'])

修改字典:

tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
tinydict['Age'] = 8               # 更新 Age
tinydict['School'] = "我很帅"  # 添加信息

删除字典元素:

tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del tinydict['Name'] # 删除键 'Name'
tinydict.clear()     # 清空字典
del tinydict         # 删除字典

返回一个字典的浅复制:

#dict.copy()
#引用就是如果被引用的的发生改变,引用的地方也发生改变
#目录的解释,第一个叫一级,依次后退
#深度拷贝就是已经转移过来,和原来的无关了,不会随其改变而改变
#对于.copy潜复制,只有一级目录是深度拷贝
dict1 =  {'user':'runoob','num':[1,2,3]}
dict2 = dict1          # 浅拷贝: 引用对象
dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,子对象是引用
dict1['user']='root'#修改一些数据以便测试
dict1['num'].remove(1)
print(dict1)#输出结果验证
print(dict2)
print(dict3)

创建一个新字典:

#newdict=dict.fromkeys(seq, value)
#seq是一个列表,用于给新字典命名的
#值可以是任何变量形式,列表也可以
#value,是对所以的键赋值初始化
#可以不赋值,那么默认0,如果赋值数小于键数,那么后面会赋值为最后一个值
seq = ('name', 'age', 'sex')#创建一个列表
newdict = dict.fromkeys(seq['liuaiwo',24,'man'])
print (str(newdict))

Python 字典 get() 函数返回指定键的值:

#dict.get(key, value) 
#用这样的一个方法去找dict中的某一个值比直接dict[key]好在于不会报错
#key是对应dict里的某一个键
#value是当找不到这个键的时候,输出的值
#dict可以嵌套,那么get也可以 比如tinydict.get('RUNOOB', {}).get('url')
#'RUNOOB'和'url'都是key

tinydict = {'Name': 'Runoob', 'Age': 27}
print ("Age : ", tinydict.get('Age'))#简单的用法,就是获取某一个键对应的值
print ("Sex : ", tinydict.get('Sex'))  #这个是实验如果不设置value 默认输出的就是none
print ('Salary: ', tinydict.get('Salary', 'hahaha'))#这个是设置value后

判断键是否存在于字典中:

#key in dict
#key not in dict
#同理的判断
#对于存在输出True,不存在输出False
thisdict = {'Name': 'Runoob', 'Age': 7}
if  'Age' in thisdict:     #书写规范是叫’:‘
    print("键 Age 存在")
else :
    print("键 Age 不存在")
#dict.setdefault(key, default=None)
# setdefault() 方法和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值
#后面的默认值可以认为设置
tinydict = {'Name': 'Runoob', 'Age': 7}
print ("Age 键的值为 : %s" %  tinydict.setdefault('Age', None))
print ("Sex 键的值为 : %s" %  tinydict.setdefault('Sex', 'man'))#默认值设为'man'
print ("新字典为:", tinydict)

以列表返回视图对象:

#dict.items()
#与c一样,需要一些格式,%s对应字符串,以%后面的替代%s
tinydict = {'Name': 'Runoob', 'Age': 7}
print ("Value : %s" %  tinydict.items())#视图返回一个字典对象
#dict.keys()
#这里返回的是键的可视图
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
keys = dishes.keys()#将全部的键导出
values = dishes.values()#将全部的值导出
#可以用print去看看可视图
print('%s' % keys)
print('%s' % values)

把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里:

#dict.update(dict2)
tinydict = {'Name': 'Runoob', 'Age': 7}
tinydict2 = {'Sex': 'female' }
tinydict.update(tinydict2)
print ("更新字典 tinydict : ", tinydict)

删除字典给定键 key 所对应的值:

#pop(key[,default])
#
site= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'}
pop_obj1=site.pop('name')#它的返回值对应的是key对应的value
pop_obj2=site.pop('sex','noexist')#它的返回值对应的是'noexist'
print(pop_obj1,pop_obj2)
#popitem()
#Python 字典 popitem() 方法随机返回并删除字典中的最后一对键和值
#如果字典已经为空,却调用了此方法,就报出KeyError异常
#返回一个键值对(key,value)形式,即最末尾的键值对
#这个是删除整个键值的method
site= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'}
pop_obj=site.popitem()
print(pop_obj)  
print(site)

提示:

  • 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
  • 键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行
  • str(dict)输出字典
  • len(dict)计算字典元素个数
  • dict.clear()清除元素

    4.集合(集合(set)是一个无序的不重复元素序列)——大括号{}

  • 基础创建:

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
set{1,2,3,4,5}

添加元素:

#set.add( x )
thisset = set(("Google", "Runoob", "Taobao"))
thisset.add("Facebook")#add(x),x是需要添加的元素
print(thisset)
#参数可以是列表,元组,字典等
#s.update( x )
#使用update更新集合
thisset = set(("Google", "Runoob", "Taobao"))#这里是使用set()去创建的一个集合
thisset.update({1,3})#当里面有多个的时候使用','隔开
print(thisset)

返回集合的差集:

#set.difference(set)
#返回存在与头set的,且不在尾set的值
x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
z = x.difference(y) 

移除两个集合中都存在的元素:

#set.difference_update(set)
#在头set中移除头set与尾set均存的元素
x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
x.difference_update(y) 
print(x)

提示:

  • 可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典,下一节我们会介绍这个数据结构。 
  • len(s)计算集合元素个数
  • s.clear()清除集合内全部元素
  • x in set 判断元素是否存在集合之中
  • set.copy()拷贝一个集合#不会被discard在后面删除某个元素影响
  • set.discard(value)#删除指定元素
  • set.intersection(set1, set2 ... etc)#返回集合交集,这是创建了一个新集合
  • set.intersection_update(set1, set2 ... etc)#这个也是放回交集,但是是在原来的set基础上,返回公有的元素
  • set.symmetric_difference(set)#放回两个集合中不重复的元素构成新集合,所以前面要有载体
  • set.symmetric_difference_update(set)#移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中,不需要前载体
  • set.isdisjoint(set)#判断两个集合是否包含相同的元素,返回布尔值,包含是False,不包含True
  • set.issubset(set)#判断指定集合是否为该方法参数集合的子集
  • set.issuperset(set)#判断该方法的参数集合是否为指定集合的子集
  • set.pop()#随机移除元素,一般为最后一个
  • set.remove(value)#和regard一样,只是在删除一个不存在的元素时会报错
  • set.update(set)#给集合添加元素,比add强,在于可以添加集合
  • set.union(set1, set2...)#创建一个新集合,值为交集,所以前面要载体

    补充:递推式

List:

  • names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
    new_names = [name.upper()for name in names if len(name)>3]#name.upper()是表达是,是后面穿来
    #的name需要执行的一个表达式;name是定义的一个变量,是执行递推式的一个桥梁;names是原list;if 后面
    #接的是从names取的name需要执行的判断句
    print(new_names)#list的递推式

    dict:

  • dic = {x: x**2 for x in (2, 4, 6)}#解释看list吧,一样的,就是开始写法不同

    set:

  • setnew={x for x in 'asjdhsfhkakfg' if x not in 'abcdef'}

    一些相关函数使用示例(add)

  • 斐波那契数实例(循环结构操作):

#联合赋值:n=b,m=a+b;a=n,b=m;
#while可以搭配else语句
a, b = 0, 1#赋值型语句
while b < 10:#python中的语句使用英文':'作为语句延续
    print(b)
    a, b = b, a+b#python的联合赋值
  • end关键字的使用:

——(将结果输出到同一行,或者在输出的末尾添加不同的字符)

#关于end关键词的示例
#对应python,一定要注意段前间隔!
a,b=0,8
while b<1314:
   print(b,end='game over')#实验最好的那个数据
   a,b=b,a+b
  • 条件语句if – elif – else:

——if-elif语句也是可以实现嵌套的(报错请使用else)

#对应Python的条件语句,是elif
#书写的格式也是使用英文':'
#常见的操作运算符<,>,<=,>=,!=,==
age = int(input("请输入你家狗狗的年龄: "))
print("")
if age <= 0:
   print("你是在逗我吧!")
elif age == 1:
   print("相当于 14 岁的人。")
elif age == 2:
   print("相当于 22 岁的人。")
elif age > 2:
   human = 22 + (age - 2) * 5
   print("对应人类年龄: ", human)

### 退出提示
input('please press the Enter')
  • 循环语句(此处使用for示例,while在上面已经说过了)

#基本格式for <variable> in <sequence>:

#     <statements>

#else:

#    <statements>

sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:  #先是对变量取值,此处也使用:
    if site == "Runoob": #对变量是否满足条件进行判断
        print("菜鸟教程!")
        break   #关键词break跳出循环,也可以使用continue,用法与c一样
    print("循环数据 " + site)
else:#这个是一个特别特殊的,可以验证对应的for循环是否正常循环
    print("没有循环数据!")
print("完成循环!")

对于循环for,我们常常涉及到一个range函数:

#遍历数字序列,可以使用内置range()函数
#range(起始数,终止数,间隔)
#它会生成数列
for x in range(5)#产生数列从0到第五个数(包括第五个数)
#对于range(5)的解释是 range(0,5)
#从零开始 到5但不包括五
#可以用索引的知识去理解
for x in range(5,9)#这个输出是5,6,7,8
for x in range(3,21,3)#这个输出是3,,6,9,12,15,18
#range()和len()函数以遍历一个序列的索引
a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ']
for i in range(len(a))#len()是索引查看的关键词

对于循环for,我们常常涉及到一个pass语句:

——Python pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句:

#pass语句就是一个占位的语句
#没有什么特别作用,是给空语句
#唯一作用就是当你写源码时,可以在你思路未好时先占位
for letter in 'Runoob': 
   if letter == 'o':
      pass
      print ('执行 pass 块')
   print ('当前字母 :', letter)
 
print ("Good bye!")

迭代器:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
  • 迭代器有两个基本的方法:iter()next()
  • 字符串,列表或元组对象都可用于创建迭代器

1.创建迭代器(iter()用法&next()):这个是用列表对象

ist=[1,2,3,4]
it=iter(ist)#使用关键词iter键列表ist创建为迭代器
print(next(it))#使用关键词next对迭代器的下一给值进行输出

2.常常与循环for搭配,形成遍历迭代:

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

3. 迭代器(用一个类,在里面写构造函数去创建迭代器)

#class是类的关键词
#class类里的构造函数,会在初始化之前运行
#类似于Python 的构造函数为 __init__(), 它会在对象初始化的时候执行
class MyNumbers:    
  def __iter__(self):  #在类的构造函数之中实现__iter__方法创建一个特殊的迭代器对象
    self.a = 1#对迭代器中的第一个值赋值
    return self#放回第一个值给myclass
 
  def __next__(self):  #并且迭代器对象实现了 __next__() 方法
    if self.a <= 20:  #使用判断和 StopIteration 异常标识去判断迭代完成
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration  #防止无限循环的出现
 
myclass = MyNumbers()#使用类的构造函数
myiter = iter(myclass)#将myclass创建为迭代器
 
for x in myiter: #遍历输出
  print(x)

生成器 :

  • 生成器是一个返回迭代器的函数
  • 使用了 yield 的函数被称为生成器(generator)
  • 调用一个生成器函数,返回的是一个迭代器对象
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0 #因为里面存在yield函数;定义一个变量counter是因为要限制循环
    while True:
        if (counter > n): 
            return
        yield a  #在这里第一次运行返回a之后,通过迭代器去进行判断
        a, b = b, a + b #下次进入循环会从这里先开始
        counter += 1 
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration: #结束运行
        sys.exit()

 函数

简单的一些Python函数解释:

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 
  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明(即写一个函数作用的解释)
  • 函数内容以冒号 : 起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None

1.基本语法:

def 函数名(参数列表):
#这个里面可以写点函数使用介绍
    函数体

2.实例及函数调用的介绍:

def printme(st):  #这里定义了一个自定义函数  1/3/6
    # 打印任何传入的字符串
    print(st)#4/7
    return #返回了None2次


# 调用函数
printme("我要调用用户自定义函数!") #2
printme("再次调用同一函数") #5

3.参数的传递:

  • 在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的
a=[1,2,3]#其实你也可以理解变量a是一个指针,它会指向对象的类型

#其中a是变量,[1,2,3]是对象

  • 类型分为可变类型和不可变类型:

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

                      ·不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a

                      ·可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了

  • 对于可变与不可变类型的实例分析:
#这个是一个不可变类型的实验

def change(a):
    print(id(a))   # 指向的是同一个对象#同时我们用id去验证是否和原地址一样
    a=10
    print(id(a))   # 一个新对象,最后你会发现它的地址改变了
 
a=1
print(id(a)) #这个是打印出原来a的内存地址
change(a)

#对于可变类型的实验演示
def changeme( mylist ):  #参数类型是list
   "修改传入的列表"
   mylist.append([1,2,3,4])#末尾增加函数
   print ("函数内取值: ", mylist)
   return
 
mylist = [10,20,30]
changeme( mylist )#在这里调用changeme函数
print ("函数外取值: ", mylist) #用这一个print语句去验证是否可变

 4.正式的参数类型:

  • 必需参数:必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样

示例:参考上基本语法的哪一个源码

  • 关键词参数:使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值

示例:

def printinfo( name, age ):
   "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return
 
#调用printinfo函数
printinfo( age=50, name="runoob" )#如果使用关键词用等号连接后不需要在意顺序

默认参数:调用函数时,如果没有传递参数,则会使用默认参数

def printinfo( name, age = 35 ):   #在这里面35就是默认参数

不定长参数:能处理比当初声明时更多的参数

一些小提示:

  • 被传入给参数的值是按顺序传入(如果没有关键字)
  • 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
  • 对于*a,如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量
  • 加了两个星号 ** 的参数会以字典的形式导入
  • 如果单独出现星号 * 后的参数必须用关键字传入
def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vartuple)
 
# 调用printinfo 函数
printinfo( 70, 60, 50 )#第一个会被传入70,第二个和第三给以元组的形式传入
#此源码演示以字典形式传入
def printinfo( arg1, **vardict ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vardict)
 
# 调用printinfo 函数
printinfo(1, a=2,b=3)
def f(a,b,*,c):
    return a+b+c

f(1,2,3) #报错
f(1,2,c=3)#正确

 5.匿名函数:Python 使用 lambda 来创建匿名函数

  • lambda 只是一个表达式,函数体比 def 简单很多
  • lambda 的主体是一个表达式,而不是一个代码块
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
  • 语法结构:lambda [arg1 [,arg2,.....argn]]:expression

基本使用示例:

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2#逗号之前写参数,逗号之后写表达式
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

 匿名函数封装:在函数内封装

一:

def myfunc(n):
  return lambda a : a * n#是将封装在函数里的匿名函数传出去
 
mydoubler = myfunc(2)#在匿名函数传给myfunc后 mydiybler=lambda a: a*2
mytripler = myfunc(3)#同理
 
print(mydoubler(11))#这里写的是mydoubler,实际上就是匿名函数
print(mytripler(11))#同理

二:

#这里我们测试的是一个匿名函数和def的杂交
def fun(a, b, opt):#这个opt计算让后面可以输入功能
    return opt(a, b)#我估计这里就是可以讲到函数嵌套了
d=fun(1, 2, lambda x, y: x * y+1)#需要一个值的接收器
print(d)

 6.return语句的使用:语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None

7.强制位置参数(这个是3.8新增的)

在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

写法:1.     f(10, 20, 30, d=40, e=50, f=60)  #True

           2.     f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用关键字参数的形式

           3.     f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式

8. eval()函数的用法:

基本语法: eval(expression, globals=None, locals=None)

注意:

  •  执行一个字符串表达式
  • globals(变量全局):这里必须得是字典形式(,如果写了globals后,在expression中的值,取字典中对应的key的value)
  • locals是该参数掌控局部的命名空间,功能和globals类似,不过当参数冲突时,会执行locals处的参数。即同就取locals里的参数

实例参考:

  1. 仅表达式
    a=10
    print(eval('a+1'))#输出的结果即11,10+1
  2. 有globals
    a=10
    g={a:2}
    print(eval('a+1',g))#结果是3

    3.有globals&locals时

a=10
g={a:2,c:4}
t={a:3,b:1}
print(eval('a+b+c',g,t))#结果是3+1+4


数据结构

1.堆栈 :append()   pop()

解释:最先进入的元素最后一个被释放(后进先出) 

示例:

#使用append()和pop()
#使用方法参考列表组里的介绍
stake[1,2,3]
stake.append(4)
stake.append(5)
stake.pop()
stake.pop()
stake.pop()

2.队列:

解释:在队列里第一加入的元素,第一个取出来

注意:拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动).

#append() pop()
#下面是一个可以控制删除次数的循环结构
#i=1
#while i<4:
#   quene.pop(0)
#   i+=1
quene=['l','j','i']
quene.append('a')
quene.append('g')
quene.append('y')
quene.pop(0)#在移除了原先的索引o之后,原1变为0
quene.pop(0)#这也就解释了为什么这样效率不高,因为后面的索引全在改变
print(quene)

3.列表推导式见上:

  • 基本格式:[3*x for x in list if expression] 
  • 一些使用推到式的技巧:1.如果希望表达式推导出一个元组,就必须使用括号

示例一:

list1=[1,2,3]#小玩法
list2=[[x,x*2] for x in list1]#还是需要一个接收器来收推导式得到的列表
print(list1)
print(list2)

示例二 :

freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
[weapon.strip() for weapon in freshfruit]
#解释strip()的用法
#strip()删除移除字符串头尾指定的字符(默认为空格或换行符)
#示例:
#str = "123abcrunoob321"
#print (str.strip( '12' ))  # 字符序列为 12

示例三:

list1=[1,2,3]
list2=[4,5,6]
newlist=[x*y for x in list1 for y in list 2]#可以使用多个for,in,if
print(newlist)

补充介绍一个round()函数的使用方法:

#round( x [, n]  )
#[]不是需要你输入的,只是告诉你[]里是可以有也可以无的
#x是一个浮点数,n是你想保留的小数位数
print "round(80.23456, 2) : ", round(80.23456, 2)

示例四:嵌套列表解析

矩阵列表的转换pass:

#这里需要去看一点矩阵的知识
#存疑,为什么新的row取的值是原row的第一个,第二个...
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]#这是一个矩阵
newmatrix=[[row[i] for row in matrix] for i in range(4)]#range(4)是0,1,2,3
print(newmatrix)

4.del语句的使用 :

解释:

  • del 语句可以从一个列表中根据索引来删除一个元素,而不是值来删除元素
  • del(data):删除整个list。
  • del(data[i]):删除data中索引为i个数据
  • del(data[i:j]):删除data中第i个数据到第j个数据之前(不含j)的数据

示例演示:

date=[1,2,3,4,5]
del (date[i])#删除索引为i的元素
del (date[a:b])#删除从索引a到索引b的元素(不包括b)
del (date)#删除全部元素,变成空列表

5. 遍历技巧

  • 对于字典中遍历时 .items()

解释:将字典按key:value输出

c = {"lui":"大哥","外号":"霸气外露"}
print(c) 		 		 # {'lui': '大哥', '外号': '霸气外露'}
print(c.items()) 		 # dict_items([('lui', '大哥'), ('外号', '霸气外露')])

print(type(c)) 			 # <class 'dict'>
print(type(c.items()))   # <class 'dict_items'> 

for a, b in c.items():
    print(a,":",b)
    print(type(a),type(b))
# for 循环 输出结果为
'''
lui : 大哥
<class 'str'> <class 'str'>
外号 : 霸气外露
<class 'str'> <class 'str'>
'''
  •  对于序列中遍历时   enumerate()

解释:将索引位置和对应值全部输出

for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)
  • 同时遍历两个或更多的序列  zip()

解释:合并多个序列,使用','隔开,方便遍历

questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
       print('What is your {0}?  It is {1}.'.format(q, a))#这里使用了一个函数.format
  • 反向遍历一个序列  reversed()
for i in reversed(range(1, 10, 2)):
      print(i)
  • 排序    sorted()
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
      print(f)


模块

 定义:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py

  • 模块导入的方法:

'''
1.定义一个模块(这个模块是只有一个name)
def name(expression):
    return result
2.将模块全部导入方法
       A
import math #使用这种方法导入模块后,使用里函数的时候需要加上模块的前缀
a=math.sin(math.pi\2)//看这
print(a)
       B
from mod import *
3.将模块部分导入的方法
from mod import a particular mod#多个函数的话就使用逗号
#例如:
from math import sin
'''
  • 如果你打算经常使用一个函数,你可以把它赋给一个本地的名称(上面有一个匿名函数的就是这样使用的)
    #fib是一个本地名称
    #fibo.fib是一个函数
    fib = fibo.fib

  • 如果对于某个模块的某个函数,不想让它被引用时使用__name__属性
    $库文件.py
    #在此文件使用函数a()时会输入第一条print
    #如果别的.py文件引入此库中的a()函数,会运行第二条print
    def a():
       if __name__ == '__main__':
        print('程序自身在运行')#如果是在自身运行即为此语段
       else:
        print('我来自另一模块')#被别的文件引入就是这个语段

  • 找到模块内定义的所有名称 dir()函数
    import shi
    shi.a()
    a=dir(shi)
    print(a)

  • 包:管理 Python 模块命名空间的形式(类似与模块写函数)

引用的方法:import 包名.主模块名.次模块名.等

解释:这里是一个多重包,就是可以在某一层的包中加一个文件 __init__.py才称为包,同时里面应该包含一个__all__ 的列表变量,那样在from package import * 的时候就把这个列表中的所有名字作为包内容导入

实例:这样在这个包里面的各个对于的模块就被导入了(echo.py...被导入)

__all__ = ["echo", "surround", "reverse"]


输入和输出

输出

        最常见的两种输出格式:表达式语句和 print() 函数

  • 如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
  • 如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现

输出一:str()

print(str(1/7))#输出是'0.。。。。'

 输出二:repr()

#将对象转化为供解释器读取的形式
#repr() 的参数可以是 Python 的任何对象
 s = 'Hello, python'
 repr(s)#输出"'Hello, python'"

输出三:输出一个平方与立方的表(方法一)

#打印一个表
#里面有几个函数.rjust()   .center()   .ljust() 
for x in range(1, 11):
     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
     # 注意前一行 'end' 的使用
     print(repr(x*x*x).rjust(4))

关于一些宽度填充函数的使用:.center  .rjust  . ljust  .zfill

举例一:center(width[, fillchar])#这一个和.rjust .ljust 是一个类型
 

#width是宽度
#fillchar是补充的字符 我喜欢用'*',一般是空格
print("God".center(7,'*'))
#输出结果:**God**

举例二:zfill()

#.zfill()也是填宽度
#不过是在左边填充0
print('12'.zfill(7))

实例:输出一个平方与立方的表(方法二)*推荐方法

for x in range(1, 11):
       print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))

关于.format前 {}使用的几种情况

  • "{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 'hello world'
  • "{0} {1}".format("hello", "world") # 设置指定位置 'hello world'
  • "{1} {0} {1}".format("hello", "world") # 设置指定位置  'world hello world'
  • print("网站名:{name}, 地址 {url}".format(name="CSDN", url="CSDN"))
  • print("网站名:{name}, 地址 {url}".format(**site))#site = {"name": "菜鸟教程", "url": "www.runoob.com"}/字典
  • print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # 索引的时候"0" 是必须的, my_list = ['CSDN', 'CSDN']

.format() 使用的一些tips

"{[index]:[^].[width]f}".format(3.1415926)
  • b、d、o、x 分别是二进制、十进制、八进制、十六进制,没有就是str型

  • ^, <, > 分别是居中、左对齐、右对齐,后面带宽度

  •  : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用
    table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
    for name, number in table.items():#复习.items是遍历字典以key:value的形式输出
        print('{0:10} ==> {1:10d}'.format(name, number))
  • !a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化
import math
print('常量 PI 的值近似为: {!r}。'.format(math.pi))
  • 在格式化字典的时候,可以用[]去引入key,从而达到在{}里面用key去格式化的技术,可以防止出错
    table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
    print('Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
    #加0是因为将要被格式化的三个value都是table里,且后面format的括号里的范围最大是0
    #如果不想加0,就得告诉编译器,这是一个dict 使用在table前加**即可
    #.format(**table)

输出四:% 操作符也可以实现字符串格式化

import math
print('常量 PI 的值近似为:%5.3f。' % math.pi)#和c一样的理解

输入

  1. input() 读取键盘输入
    str = input("请输入:")#唯一需要提醒的就是需要一个对键盘输入的接收器
    print ("你输入的内容是: ", str)
  2. open() 返回一个 file 对象

基本格式:open(filename, mode)

  • filename是文件名称 
  • mode决定了打开文件的模式 (这里需要参考我的博客图鉴,下面会有点讲解)

三种基础模式

  • r(默认模式→只读模式)
  • w(只写模式):这个模式是从头开始写文件,原有的会被删除;如果这个文件没被创建,还会创建此文件
  • a(追加模式):这个模式会从最底下开始写,不会删除原内容;如果该文件不存在,创建新文件进行写入

模式的改变

  • 加‘+’在原有的模式基础上加读或写
  • 字母'b'以二进制的格式打开(添加优先级高于'+')

示例:rb+:读写模式,且以二进制的模式打开

创建txt和写txt的实例:


# 打开一个文件
#如果是用编译器写,注意你的换行符\n,因为后面你读的时候需要用上
f = open("路径", "w")
f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
# 关闭打开的文件,这一步不能少,不然你的文件一直是开的
f.close()

3.打开了一个文件后的操作(后面的例子都是打开了一个叫f的文件)

         A.f.read(size):将读取一定数目的数据, 然后作为字符串或字节对象返回

                 ·size 是一个可选的数字类型的参数

                 · 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回

                 ·.read()需要一个接收器哦,然后用就可以打印出来了

         B.f.readline(): 从文件中读取单独的一行(\n)

                 ·f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行

                 ·.readline()同样需要一个接收器哦,然后用就可以打印出来了  

         C.f.readlines(): 将返回该文件中包含的所有行

                 ·f.readlines() 如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割

                 ·每行读取的另外一种方法迭代一个文件对象然后读取每行:

#注意:这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用
# 打开一个文件
f = open("f.txt", "r")

for line in f:
    print(line, end='')

# 关闭打开的文件
f.close()

         D. f.write(string):将 string 写入到文件中, 然后返回写入的字符数

                 ·在书写的时候用\n去换行

                 ·如果需要看到返回的字符数,用一个变量去接受这个对象,然后输出就可以查看

                 ·如果想一下写多行,writelines()是个不错的选择,就是换行要打/n

                 ·如果要写入一些不是字符串的东西, 那么将需要先进行转换:

f = open("f.txt", "w")
value = ('www.love.com', 14)
s = str(value)#格式转换
f.write(s)

# 关闭打开的文件
f.close()

         E. f.tell():返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数

                 ·用一个变量去接受f.tell()再输出就可以看字节数了(推荐小白去查一下字节)

         G.f.seek():改变文件当前的位置

                 ·f.seek(offset, from_what) 

                 ·offset表示移动的字符数,1(向后一个字符),-1(向前移动一个字符)

                 ·from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,from_what 值为默认为0

                 ·一般这个是与.write &&.read一起用,用来修改file

         E. f.close():调用 f.close() 来关闭文件并释放系统的资源

处理一个文本的文件的一般用法:with关键字

with open('/d/love.txt', 'r') as f:
    read_date=f.read()
f.close

相关的库:pickle模块

  • pickle模块实现了数据序列和反序列化
  • 序列化(serialization)就是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等;

  • 反序列化(deserialization)则是将从网络、磁盘等读取的字节数组还原成原始对象,以便后续业务的进行,一般也将反序列化称为解码(Decode),主要用于网络传输对象的解码,以便完成远程调用。

  • pickle模块使用的数据格式是python专用的,能够把Python对象直接保存到文件,而不须要把他们转化为字符串,也不用底层的文件访问操作把它们写入到一个二进制文件中

最为常用的函数:

A.pickle.dump(obj, file, [,protocol]) 

          ·接受一个文件句柄和一个数据对象作为參数,把数据对象obj以特定的格式保存到给定的文件file里

          ·obj:想要序列化的obj对象 [序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程]

          ·file:文件名称 

          ·protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL(这是一个协议),则使用最高的协议版本

B. pickle.load(file)

           ·将file中的对象序列化读出(反序列化)

           ·file是文件名称,写路径

实战案例:

import pickle
#序列化到文件
obj = 123, "abcdedf", ["ac", 123], {"key": "value", "key1": "value1"}
print("输出如下")
print(obj)
#wb 读写到二进制文件
f = open("D:\python file practice\ss.txt",'wb')
pickle.dump(obj,f)
f.close()
f = open("D:\python file practice\ss.txt",'rb')
print(pickle.load(f))
f.close()
#输出如下
#(123, 'abcdedf', ['ac', 123], {'key': 'value', 'key1': 'value1'})#这个是print
#(123, 'abcdedf', ['ac', 123], {'key': 'value', 'key1': 'value1'})#这给是pickle.load(f)

C.  pickle.dumps(obj[, protocol])&&pickle.loads(file)

          ·pickle.dumps()将obj转发为仅python可以识别的string形式

          ·pickle.loads()将obj反序列化转出来

          ·与A&&B同种理解方法


Python file

  • 打开(返回)文件对象的方法:open(filename[,mode])

          ·如果该文件无法被打开,会抛出 OSError 

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

  • 完整的语法格式:
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
  • file 对象常用的函数 (上面出现的此处无)

1. file.flush():方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入

          ·为什么设置缓冲区的简单理解:内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节,内存中的程序大部分时间都处于等待状态

          ·该方法没有返回值 

使用实例:

#引自https://blog.csdn.net/cumtb2002
# Python File flush() Method with Example
 
# creating a file 
myfile = open("hello.txt", "w")
 
# writing text to the file 
myfile.write("Hello friends, how are you?")
 
# flushing the internal buffer
myfile.flush()
# writing the text again
myfile.write("\nI am good, what about you?")
 
# flushing the internal buffer
myfile.flush()
# writing the text again
myfile.write("\nI am good too, thanks!")
 
# closing the file
myfile.close()
 
# reading content from the file
myfile = open("hello.txt", "r")
print("file content...")
print(myfile.read())
myfile.close()
#总结flush即为让缓冲区的数据更快输入输出,起一个加速的作用

2. fileno():返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作

          ·返回文件描述符(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推)

使用实例:

#有一个.name的函数,是反回值是文件名称的一个函数
#使用.fileno()函数是想查看文件的进程顺序
# 打开文件
fo = open("jiesule.txt", "wb")
print ("文件名为: ", fo.name)
fid = fo.fileno()
print ("文件描述符为: ", fid)
# 关闭文件
fo.close()

3. file.isatty():检测文件是否连接到一个终端设备,如果是返回 True,否则返回 Fals

          · 返回值是布尔值

使用实例:

#终段设备是类似与键盘之类的
fo = open("jiesle.txt", "wb")
print ("文件名为: ", fo.name)
ret = fo.isatty()
print ("返回值 : ", ret)
fo.close()

4. file.seek():用于移动文件读取指针到指定位置

          · 基本语法:fileObject.seek(offset[, whence])

     

  • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始

  • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起(这里需要注意,只有当文件以二进制的方式打开的时候才有1或2)

  • 一般与.tell()连用,tell()可以查看文件偏移量

  • 如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1

使用实例:


fo = open("D:\python file practice\oo.txt", "wb")
fo.write(b'0123456789abcde')
a=fo.seek(5)
b=fo.seek(-3,2)#这里如果没有2告诉编译器是从尾开始,会报错
print ("文件名为: ", fo.name)
print(a,b)
fo.close()

作用二:循环读取文件的内容 

          · 实现原理:当你使用read//readline后,文件指针已经不在开头,使用.seel(0,0)即可恢复指针在最开始

实例:

#这里mode的选择用r/r+
#如果使用w/w+是写,会清空原内容,即无法使用read/readline
#如果使用a/a+是追加,由于指针在末尾,也无法读,但也可以修改
#在开始使用read/readline之前,使用seek(0)将指针移到最开始
fo = open("D:\python file practice\ss.txt", "r+")
a=fo.readline()
print(a)
fo.seek(0)
b=fo.readline()
print(b)
fo.close()

5. file.tell():返回文件的当前位置,即文件指针当前位置

          ·返回文件的当前位置

使用实例:

fo = open("D:\python file practice\ljw.txt", "a+")
fo.seek(0)
c=fo.tell()#这个函数是查看指针位置的函数
print(c)
a=fo.readline()
print(a)
fo.seek(0)
b=fo.readline()
print(b)
fo.close()

6. file.truncate():用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小

          ·基本语法:fileObject.truncate( [ size ])

使用实例:

fo = open("D:\python file practice\ljw.txt", "r+")#文件里面有1/n 2/n 3/n
a=fo.readline()
print(a)
#此例为带size参数,使用时一定主要不同的类对应的字符数
fo.truncate()#因为里面无参数size,即从当前位置截断,namely,将1/n干掉
b=fo.readlines()#输出全部行,验证是否被截断
print(b)
fo.close()

 

       

                                      

                                           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值