文件处理及函数

文件:
f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
一次读一行:
print(f.readline())
消除空格即\n:
print(f.readline(),end=‘‘)
print(f.readline(),end=‘‘)
读所有:
print(f.readlines())
关闭文件:f.close()
------------------------------------------
动作完成之后可以自动完成关闭操作:
with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)as f :
pass
================================================
w写操作,文件不存在则新建文件,如果文件存在则覆盖(清空)

f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
f.write(‘asdf‘)
-----------------------------------------------------
可以写多行
f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
f.writelines([‘a‘,‘b‘,‘c‘])
======================================================

内存用unicode
硬盘用utf-8(保证存储容量用量越小越好),gbk都可以
unicode----》encode(‘utf-8’)-----》bytes
bytes----》decode(‘utf-8’)---》unicode

原则:
字符以什么格式编译的,就要以什么编码解码

PS:
python3中的字符串分为两种
x=‘egon‘存成unicode
y=x.encode(‘utf-8‘)存成bytes

python2中字符串也分为两种
x=u‘egon‘与python3的字符串一样
y=‘alex‘ 与python3的bytes一样
---------------------------------------------------
a文本模式的追加,文件存在,不存在则创建
f=open(‘a.txt‘,‘a‘,encoding=‘utf-8‘)
print(f.tell())
查看光标位置tell:
f=open(‘a.txt‘,‘a‘,encoding=‘utf-8‘)
print(f.tell())
52
---------------------------------------------------
拷贝文件方法用b模式读写可以解决视频和文件及图片复制问题
f=open(‘VN.jpg‘,‘rb‘)
print(f.read())
with open(‘VN.jpg‘,‘rb‘) as read_f,open(‘1.jpg‘,‘wb‘) as rewrite_f:
for line in read_f:
rewrite_f.write(line)

--------------------------------------
这是一个拷贝文件的小程序:
import sys
# print(sys.argv)
if len(sys.argv) < 3:
print("Usage:python3 copy.py source.file target.file")
sys.exit()
with open(r‘%s‘%sys.argv[1],‘rb‘) as read_f,\
open(r‘%s‘%sys.argv[2],‘wb‘) as write_f:
for line in read_f:
write_f.write(line)
*r代表在windows中把\代表成没有意义
在Windows操作为:python E:\py\课后练习\copy.py E:\py\课后练习\1.jpg E:\py\课后练习\2.jpg
-------------------------------------------------------
都是以字节为参数(文本模式中read会自动解码,只有read可以读字符),seek控制文件中光标移动,tell查看光标位置,truncate从开头到哪一个字节的位置其余位置都除去

seek有三种模式*1模式和2模式只可以在b模式运行(6,0)这个表示从文件开头,(6,1)表示从光标在的字节开始移动6个字节,*(1,2)从文件最后一行切,正数为从文件后面开始,负数为从文件最后往左切

truncate截断文件,
with open(‘a.txt‘,‘r+‘,encoding=‘utf-8‘)as f:
f.truncate(2)

写程序遇到的问题:
1.复杂度增大
2.组织结构不清晰
3.可读性差

代码冗余
可扩展性差

解决问题:
一个函数为了实现一个功能
工具就是具备某一种功能的物件,就是程序中函数的概念
事先准备工具的过程称为函数的定义
遇到特定的场景拿来就用称为函数的调用

函数的分类:
内置函数
自定义函数
函数的使用:
1 先定义阶段(只检测语法错误)

2 在调用阶段

函数的定义语法

def 函数名(参数)
‘注释’
函数体
return 返回值

函数名一般是动词
参数

定义函数的三种模式:
无参:
有参:
空函数:
def bar():
pass

return内部可以有多个return,但是只能执行一次,函数就技术调用,并且会把return后的值作为函数执行的结果返回
return 后面值没有类型限制

函数调用的三种形式:
语句形式:
表达式性形式:
当中另外一个函数的参数:

函数的参数:
形参:在定义函数时,括号内的参数称为形参
特点:形参就是变量名
def foo(x,y): x=1,y=2
print(x)
print(y)

实参:在调用函数时,括号内的参数称为实参
特点:实参就是变量值
foo(1,2)

在调用阶段实参(变量值)才会绑定形参(变量名)
调用结束后,解除绑定

参数的分类:
----------------------------------------------------
位置参数:按照从左到右的顺序依次定义的参数
位置形参:必选参数,多一个不行,少一个不行
位置实参:与形参按照位置一一对应
----------------------------------------------------
def foo(x,y):
print(x)
print(y)

foo(1,2)
----------------------------------------------------
关键字实参:指的是按照x=1的形式,指名道姓的给x
def foo(x,y):
print(x)
print(y)

foo(y=2,x=1)

关键字实参需要注意的问题是:
def foo(x,y,z):
print(x)
print(y)
print(z)
foo(y=2,x=1,z=3)
*位置实参必选在关键字实参的前面
*一定不要对同一个形参传多个值
-------------------------------------------------------
默认形参:在定义阶段就已经为形参赋值,意味在调用阶段就可以形参赋值,可以不用赋值
def foo(x,y=1111):
print(x)
print(y)

foo(1)
效果:
1
1111

def register(name,age,sex=‘male‘):
print(name,age,sex)

register(‘asb‘,73)
register(‘wsb‘,84)
register(‘ysb‘,38)
register(‘yaya‘,18,‘heihei‘)
效果:
asb 73 male
wsb 84 male
ysb 38 male
yaya 18 heihei

默认参数需要注意的问题

*默认参数必须放在位置参数之后

*默认参数只在定义阶段赋值!!!一次仅一次

*默认参数的值应该被定义成不可变类型(数字、元祖、字符串)

====================================================================
可变长参数指的是实参的个数不固定
#实参无非位置实参和关键字实参两种

形参必须要有两种机制来分别处理按照位置定义的实参溢出的情况:* 等同于元祖默认*args
def foo(x,y,*args):
print(x)
print(y)
print(meng)
foo(123,456,2344,345,626)
效果:
123
456
(2344, 345, 626)
--------------------------------------------
跟按照关键字定义的实参溢出的情况:**等同于字典 默认kwargs
def foo(x,y,**kwargs):
print(x)
print(y)
print(meng)
foo(x=1,y=2,c=3,r=5)
效果:
1
2
{‘c‘: 3, ‘r‘: 5}
----------------------------------------------
命名关键字参数:在*后面定义的形参称为命名关键字参数,必须是以关键字形式
def foo(name,age,*,sex):
print(name)
print(age)
print(sex)
foo(‘egon‘,18,sex=‘male‘)
效果:
egon
18
male
----------------------------------------------------------------------------
函数是第一类对象:指的是函数可以被当做数据传递
def foo():
print(‘from foo‘)
1.被赋值
f=foo
print(f)
f()

2.可以当做参数传入
def wrapper(func):
print(func)
wrapper(foo())

3.可以当做函数的返回
def wrapper(func):
return func
res=wrapper(foo)
print(res)

*(对本周作业有用)4.可以当做容器类型的元素
cmd_dic={
‘func‘:foo
}
print(cmd_dic)
cmd_dic[‘func‘]()

效果:
{‘func‘: <function foo at 0x0000000002023EA0>}
from foo

时间: 2024-08-11 13:20:48

文件处理及函数的相关文章

字符编码、文件操作、函数定义

一.字符编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字符被编

NS前缀\OC中的注释\访问OC原文件、C原文件中的函数

///////////////////////////////////////// //////////////////////////////////////// NS前缀 NS来自于NeXTStep的一个软件 NeXT Software OC中不支持命名空间(namespace) NS是为了避免命名冲突而给的前缀 看到NS前缀就知道是Cocoa中的系统类的名称 "@"的使用方法 1.@""这个符号表示将C中的字符串转化为OC中的字符串对象 2.@符号 OC中的大

webBrowser调用外部js文件和js函数(转载)

原文链接:http://fy5388.blog.163.com/blog/static/56499537201012594314130/ webBrowser调用外部js文件和js函数 '第一种方法:webbrowser动态调用html和js代码,都是动态的:代码示例: webBrowser1.Navigate("about:blank");webBrowser1.Document.OpenNew(True);webBrowser1.Document.Write("<H

c语言文件操作常用函数及读写文件代码举列

文件操作常用函数 fopen() 打开流 fclose() 关闭流 fputc() 写一个字符到流中 fgetc() 从流中读一个字符 fseek() 在流中定位到指定的字符 fputs() 写字符串到流 fgets() 从流中读一行或指定个字符 fprintf() 按格式输出到流 fscanf() 从流中按格式读取 feof() 到达文件尾时返回真值 ferror() 发生错误时返回其值 rewind() 复位文件定位器到文件开始处 remove() 删除文件 fread() 从流中读指定个数

目录操作和文件操作的函数

一:目录操作的函数1.创建目录: mkdir(目录地址和名字,权限)----第三个参数bool,支持递归创建 2.删除目录:目录下没有其他文件的时候才可以 rmdir(目录地址) 3.移动目录(改名): rename(原始文件路径,新的文件路径) 4.获取目录的内容 1,打开目录,opendir,得到一个目录句柄(目录资源) 2,依次读取目录内的文件,readdir 3,关闭目录句柄(closedir)遍历目录下的所有文件!遍历只会遍历当前目录下的(一层) 5.获取当前工作路径 getcwd--

C++编程常用头文件及其包含函数汇总

1. #include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件. 当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现:当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std:这样才能正确使用cout.   2.#include <cstdlib>是C++里面的一个常用函数库, 等价于C中的<stdlib.h>

BCB常用文件与字符串函数

VCL库函数简介 一.BORLAND C++ BUILDER VCL的内存管理函数 1. AllocMem 在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下: void * __fastcall AllocMem(Cardinal Size): 2. SysFreeMem 释放所指定的内存块.函数原型如下: int __fastcall SysFreeMem(void * P): 3. SysReallocMem 要求重新分配参数Size所指定的内存.函数原型如下: v

DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别

原想是不在DLL中使用.def文件的,直接在需要导出的函数前加__declspec(dllexport)修饰.但在是要导出STDAPI __declspec(dllexport) DllGetClassObject的时候,就提示"warning C4518: “__declspec(dllexport ) ” : 此处遇到意外的存储类或类型说明符:被忽略"(我用的是vc.net 2003). STDAPI这个宏扩展出来是extern "C" HRESULT __st

常见的文件和目录函数

在APUE这本书,第三章与第四章都是在讲一些关于文件操作和目录操作的函数.简单地说明一下涉及到的函数及其使用. open函数 原型为: #include<fcntl.h> int open(const char *pathname, int oflag,.../*mode_t mode*/); 该函数是用来打开或创建一个文件(记住:是文件,不包括目录),第三个参数只有当打开文件不存在时(即open函数执行的是创建文件)才有用,mode_t是用来指定创建文件的用户ID,组ID,其他用户的读写权限

VS2013 VC++的.cpp文件调用CUDA的.cu文件中的函数

CUDA 8.0在函数的调用中方便的让人感动.以下是从网上学到的VC++的.cpp文件调用CUDA的.cu文件中的函数方法,和一般的VC++函数调用的方法基本没差别. 使用的CUDA版本为CUDA 8.0 ,默认安装. 1.VS2013新建CUDA 8.0项目 2.修改工程 .cpp调用.cu文件的基础是  函数的定义和函数的实现可以在不同的文件,而且.cu文件也支持这一特点,所以就可以修改成以下情况,即新建kernel.h和main.cpp,把头文件和函数声明写在头文件里面,kernel.cu