一 编码操作

1 编码 enconde()

英文字符编码为"utf-8"时,一个字符占一个字节。

s1='abcdef'
b1=s1.encode('utf-8')
print(b1)
结果为:b'abcdef'

汉字编码为"utf-8"时,一个汉字占三个字节。

汉字编码为"gbk"时,一个汉字占两个字节。

s2='中国'
b2=s2.encode('utf-8')
b3=s2.encode('gbk')
print(b2)
print(b3)
结果为:
b'\xe4\xb8\xad\xe5\x9b\xbd'
b'\xd6\xd0\xb9\xfa'

2 解码 deconde()

s4="你好"
b4=s4.encode('utf-8')
b5=b4.decode('utf-8')
print("'你好'编码为'utf-8'后为:",b4)
print("解码后为:",b5)
b6=s4.encode('gbk')
b7=b6.decode('gbk')
print("'你好'编码为'gbk'后为:",b6)
print("解码后为:",b7)
结果为:
'你好'编码为'utf-8'后为: b'\xe4\xbd\xa0\xe5\xa5\xbd'
解码后为: 你好
'你好'编码为'gbk'后为: b'\xc4\xe3\xba\xc3'
解码后为: 你好

二 深浅copy

定义:

在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。

浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制

深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。

1 浅copy

(1)浅copy 第一层各自独立,从第二层开始,共用一个内存地址。

s1=[1,2,3]
s2=s1
print(s1,s2)
s1.append(666)
print(s1)
print(s2)
print(id(s1))
print(id(s2))

结果为:

[1, 2, 3] [1, 2, 3]
[1, 2, 3, 666]
[1, 2, 3, 666]
2670563612488
2670563612488

可以看到s1、s2的内存地址是一样的,既就是s2为s1的一个引用而已。

(2)

s3=[1,2,3,[44,55]]
s4=s3.copy()
s3[-1].append(666)
print(s3)
print(s4)
print(id(s3[-1]))
print(id(s4[-1]))

结果为:

[1, 2, 3, [44, 55, 666]]
[1, 2, 3, [44, 55, 666]]
1781567379272
1781567379272

2深copy

import copy
s5=[1,2,3,[44,55]]
s6=copy.deepcopy(s5)
s5.append(666)
print(s5)
print(s6)
print(id(s5))
print(id(s6))

结果为:

[1, 2, 3, [44, 55], 666]
[1, 2, 3, [44, 55]]
1774773104968
1774773106248

可以看到s5、s6的内存地址是不一样的。

对于深copy来说,两个是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。

总结:

(1)深浅拷贝都是对源对象的复制,占用不同的内存空间。

(2)不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。

(3)可变类型:

=浅拷贝: 值相等,地址相等

copy浅拷贝:值相等,地址不相等

deepcopy深拷贝:值相等,地址不相

三 文件操作

操作系统读写文件的一般流程:

(1)打开文件,产生文件句柄。

(2)对文件句柄进行操作。

(3)关闭文件句柄

文件句柄

在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。

1 读 r

(1)全部读出来read()

f1=open('log.txt',encoding='utf-8')
content=f1.read()
print(content)
f1.close()
结果为:

abcde
fghigk
lmnopq

(2)读一部分 read(n)

f2=open('test.txt',encoding='utf-8')
print(f2.read(3))
f2.close()
结果为:你好五
f3=open('test.txt','rb')
print(f3.read(3).decode('utf-8'))
f3.close()
结果为:你

说明:

r 模式 read(n) n 按照字符读取。

rb 模式 read(n) n 按照字节读取

(3)按行读取 readline()

f4=open('test.txt',encoding='utf-8')
print(f4.readline())
print(f4.readline())
f4.close()
结果为:
你好五月
第二行1abcdefghijklmnopqrstuvwxyz

(4)readlines() 读取所有行,并存入列表中

f5=open('test.txt',encoding='utf-8')
print(f5.readlines())
f5.close()
结果为:
['你好五月\n', '第二行1abcdefghijklmnopqrstuvwxyz\n', '']

(5)for 循环逐行读取

f6=open('test.txt',encoding='utf-8')
for line in f6:
print(line)
f6.close()

结果为:

你好五月

第二行1abcdefghijklmnopqrstuvwxyz

2345

(6)读写 r+ ,先读后写

f7=open('test.txt','r+',encoding='utf-8')
print("原始文件为:",f7.read())
f7.write('aaaa')
f7.seek(0)
print("修改后文件为:",f7.read())
f7.close()

结果为:

原始文件为: 你好五月
第二行1abcdefghijklmnopqrstuvwxyz
2345
修改后文件为: 你好五月
第二行1abcdefghijklmnopqrstuvwxyz
2345aaaa

注意:

如果是Windows系统文件,加路径读取方式如下

f1=open(r'D:\Python\python\day03\test.txt',,encoding='utf-8')

2 写 w

(1)w 如没有文件,新建文件写入内容

有原文件,先清空内容,在写入新内容

f1=open('test2.txt','w',encoding='utf-8')
f1.write('这个世界很疯狂')
f1.close()

写入完毕,下来读取文件

f1=open('test2.txt',encoding='utf-8')
print(f1.read())
f1.close()
结果为:这个世界很疯狂

(2)图片的读取及写入

原图如下

先来读取图片、目前读取二进制文件内容

p1=open('girl.jpg','rb')
content = p1.read()
print(content)
p1.close()
结果为:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x02\x02\x02\x03\x02\x02\x02\x03\x03\x03\x03\x04\x06\x04\x04\x04\x04\x04\x08\x06\x06\x05\x06\t\x08\n\n\t\x08\t\t\n\x0c\x0f\x0c\n\x0b\x0e\x0b\t\t\r\x11\r\x0e\x0f\x10\x10\x11\x10\n\x0c\x12\x13\x12\x10\x13\x0f\x10\x10\x10\xff\xdb\x00C\x01\x03\x03\x03\x04\x03\x04\x08\x04\x04\x08\x10\x0b\t\x0b\x10\x10
\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x………………….

写入,也是用二进制编码写入

p1=open('girl.jpg','rb')
content = p1.read()
print(content)
p2 = open('girl2.jpg', 'wb')
p2.write(content)
p1.close()
p2.close()

(3)w+先写后读

f2=open('log2.txt','w+',encoding='utf-8')
f2.write('我在测试先写后读')
f2.seek(0)
print(f2.read())
f2.close()
结果为:我在测试先写后读

(4)a 没有文件则新建文件并写入,有的话直接追加

a附加写方式打开,不可读

先追加

f3=open('log3.txt','a',encoding='utf-8')
f3.write('今天是周一\n')
f3.seek(0)
f3.close()

在读取

f4=open('log3.txt',encoding='utf-8')
print(f4.read())
f4.close()
结果为:今天是周一

(5)a+: 附加读写方式打开

f5=open('log4.txt','a+',encoding='utf-8',)
f5.write('我在测试a+模式')
f5.seek(0)
print(f5.read())
f5.close()
结果为:我在测试a+模式

(6)其他操作方法

# readable 是否可读

# writable 是否可写

# f1.seek(12) # 任意调整

# f1.seek(0,2) #光标调整到最后

# f1.seek(0) #光标调整到开头

# f1.tell() # 告诉光标的位置

# f1.truncate(3) # 按照字节对原文件进行截取 必须在a 或 a+ 模式

(7)不用主动关闭文件句柄

with open('log.txt',encoding='utf-8') as f6:
print(f6.read())
结果为:
abcde
fghigk
lmnopq
rstuvwxy

当然也可一次操作多个文件

with open('log.txt',encoding='utf-8') as f6,\
open('log3.txt','a+',encoding='utf-8') as f7:
print(f6.read())
f7.write('文件句柄测试')
f7.seek(0)
print(f7.read())

结果为:

abcde
fghigk
lmnopq
rstuvwxy 今天是周一
今天是周一
文件句柄测试

3 改

(1)以读模式打开原文件。

(2)以写的模式打开一个新文件。

(3)将原文件读出按照要求修改将修改后的内容写入新文件。

(4)删除原文件。

(5)将新文件重命名原文件。

import os
with open('file', encoding='utf-8') as f1,\
open('file.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('abc', 'hhh')
f2.write(new_content) os.remove('file')
os.rename('file.bak', 'file')

#升级版本

import os
with open('file', encoding='utf-8') as f1,\
open('file.bak', encoding='utf-8', mode='w') as f2:
for line in f1:
new_line = line.replace('abc','hhh')
f2.write(new_line) os.remove('file')
os.rename('file.bak', 'file')

四 初识函数

1 函数的定义

(1)什么是函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。

你已经知道Python提供了许多内建函数,比如print()。

但你也可以自己创建函数,这被叫做用户自定义函数。

(2)定义函数:

def 关键字 函数名():
函数体
函数执行:函数名()
函数:以功能为导向
s = 'asdgagsgadsgag'
def my_len():
count = 0
for i in s:
count += 1
print(count)
print(my_len())

2 函数的终止与返回值

(1)终止函数。

(2)给函数的执行者返回值。

return 或者 return None

return 单个值

return 多个值 会将多个值放到一个元组中,将元组返回个函数的执行者

3 函数的传参

(1)认识实参、形参

def my_len(argv): # 形式参数 ,形参
count = 0
for i in argv:
count += 1
return count s = 'lkfjsjulkjdgjdsf'
l1 = [1, 2, 3, 4, 5]
my_len(s) # 实际参数, 实参
print(my_len(l1))
  1. 实参角度

    位置参数 按照顺序一一对应

    关键字传参 一一对应

    混合参数,(位置参数,关键字参数) 关键字参数必须在位置参数后面。

  2. 形参角度

    位置参数,按顺序一一对应。

    默认参数, 默认参数在位置参数的后面。

    动态参数, *args, **kwargs 万能参数。

    所有的位置参数,放在一个元组中。

    所有的关键字参数,放在一个字典中。

  3. 形参的顺序

    位置参数 *args, 默认参数,**kwargs

我的Python之旅第三天的更多相关文章

  1. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  2. Python之旅.第三章.函数3.30

    一.迭代器 1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来2.要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?可迭代的对象:在python中,但凡内置 ...

  3. Python之旅.第三章.函数3.28

    一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 ...

  4. Python之旅.第三章.函数3.29

    一.无参装饰器 1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提 ...

  5. Python之旅.第三章.函数3.27

    一.形参与实参 1.形参与实参是什么? 形参(形式参数):指的是 在定义函数时,括号内定义的参数,形参其实就变量名 实参(实际参数),指的是 在调用函数时,括号内传入的值,实参其实就变量的值 x,y是 ...

  6. Python之旅.第三章.函数3.26

    一.函数: 1.为什么要有函数?什么是函数? 1.组织结构不清晰,可读性差 2.代码冗余 3.管理维护的难度极大,扩展性 具备某一个功能的工具就是程序的中函数 事先准备工具的过程---->函数的 ...

  7. Python 之旅

    Python2 之旅:   https://funhacks.net/explore-python/ <Python Cookbook>第三版   PYTHON3   http://pyt ...

  8. JavaScript之旅(三)

    JavaScript之旅(三) 三.函数 在JavaScript中,定义函数的方式如下: function abs(x) { ... return ...; } 如果没有return,返回结果为und ...

  9. 我的django之旅(三)数据库和模型

    我的django之旅(三)模型和数据库 标签(空格分隔):模型 数据库 ORM 1.django ORM django内置了一套完整的解决方案,其中就包括他自己的ORM.可惜没有使用SQLAlchem ...

随机推荐

  1. Leetcode_260_Single Number III

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50276549 Given an array of numb ...

  2. 【Qt编程】基于Qt的词典开发系列<十三>音频播放

    在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直 ...

  3. Select、Poll与Epoll比较

    (1)select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志 ...

  4. DB Query Analyzer 5.05 is released, 65 articles concerned have been published

    DB Query Analyzer 5.05 is released, 65 articles concerned have been published DB Query Analyzer is p ...

  5. 存储引擎-Buffered tree

    Buffered-tree 也称为COLA,即cache-oblivious,可以不需要知道具体内存大小和一个块的大小,使用一套逻辑进行处理,因此内存大小可知,内存可能被临时占用去做其它事情. Buf ...

  6. SQLCODE和SQLERRM .

    Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息. OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕 ...

  7. 线程ava.lang.OutOfMemoryError: unable to create new native thread

    近日开发遇到多线程的问题: java.lang.OutOfMemoryError: unable to create new native thread Exception in thread &qu ...

  8. 解决:MySQL 报错:1045 - Access denied for user 'root'@'localhost'(using password YES)

    一.前言 今年疯狂迷上了开源,只要看到好的开源项目,就会不顾一切一股脑扎进去研究,五一期间发现一个很好的关于众筹的开源项目,但不巧,这个项目竟然是 PHP 写的,没学过 PHP,自然对这个开源项目毫无 ...

  9. MySQL 库名重命名

    MySQL ( RENAME database olddbname TO newdbname )  对库名的重命名上会出现一些奇怪的错误.有丢失数据的风险. 所以如何去重命名呢: 1 用mysqldu ...

  10. use ECharts with Angular 2 and TypeScript

    https://stackoverflow.com/questions/38158318/is-it-possible-to-use-echarts-baidu-with-angular-2-and- ...