1.函数基本语法及特性
函数是什么?
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
减少重复代码
使程序变的可扩展
使程序变得易维护
语法定义
def sayhi():#函数名 print("Hello, I'm nobody!") sayhi() #调用函数
可以带参数
#下面这段代码 a,b = 5,8 c = a**b print(c) #改成用函数写 def calc(x,y): res = x**y return res #返回函数执行结果 c = calc(a,b) #结果赋值给c变量 print(c)
2.函数参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
3.默认参数
看下面代码
def func_test(x,y):#x,y为形参 res = x+y return res z = func_test(2,4) #2,4为x,y的实参print(z)
test(x,y,z=9(1,2,3) test(1,z=8,y=2)test(1,2) C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/1 2 3 ------------ 1 2 8 ------------ 1 2 9 ------------
另外,你可能注意到了,在把country变成默认参数后,我同时把它的位置移到了最后面,为什么呢?
位置参数必须在关键参数前面
4.参数组*args,传字典 **kwargs
#参数组 #若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数。 #*args 接收位置参数,不接受关键字参数,转化为元组 def test1(name,*args): print(name) print(args) test1("alex",1,2,3,4,5,5) C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/func.py alex (1, 2, 3, 4, 5, 5) print("=========字典=======")#传字典 **kwargs :将关键字参数,转换为字典的方式 def test2(**kwargs): print(kwargs) print(kwargs["name"]) test2(name="alex",age=8,sex="man") test2(**{'age': 8, 'name': 'alex', 'sex': 'man'})#混和 def test3(name,age=18,**kwargs): print(name) print(age) print(kwargs) test3("alex", sex="man") test3("alex",1,sex="man",hobby="tsl") test3("alex",sex="man",hobby="tsl",age=1) print("---------------------") def test4(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs) test4("alex",34,1,2,3,sex="man", hobby="tsl") #关键字参数,一定要在最后一个位置参数后maintest4("alex",age=34,sex="man",hobby="tsl")
5.局部变量
局部变量只在他的作用域内其起作用,也可以声明为全局变量,不过因为写代码长的时候随便声明可能会乱,所以不推荐。
def change_name(name): print("before change:",name) name = "里面的局部变量" print("after change:", name) name=('外面的全局变量') change_name(name) print("在外面看看name改了么?",name) ''' before change: 外面的变量 after change 里面的变量 在外面看看name改了么? 外面的变量 '''
print("===========全局/局部变量=======") sex = "m" def test5(n): #global age #如果要在函数内改全局变量,用global声明 sex = "g" #局部变量改不了全局的变量 print("before change:", n,sex) n = "Alex Li" #这个函数就是这个变量的作用域 age = 20 print("after change:", n,age,sex) name = "alex" test5(name) #print(name,age,sex) #age局部变量不能在函数外使用 print(name,sex)
函数内是可以修改全局列表的
print("======函数修改列表====") names = ["alex","jack","rain"] def change_list(): names[0]= "ALEX" print(names) change_list() print(names)
6.递归函数
#函数内部调用自己。 #1.必须有一个明确的结束条件,最大递归次数999. #2.每次进入更深一层递归时,问题规模相比上次递归应有减少 #3.效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
print("========递归函数=========")#函数内部调用自己。1.必须有一个明确的结束条件,最大递归次数999.#2.每次进入更深一层递归时,问题规模相比上次递归应有减少#3.效率不高def test6(n): print(n) if int(n/2) > 0: return test6(int(n/2)) print("-->",n) test6(10)
7.高阶函数
print("========高阶函数=========")#变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 #abs 转化为正数的函数 def add(x,y,f): return f(x)+f(y) res = add(3,-6,abs) print(res)
8.字符编码与转码
Python3中默认的字符编码为Unicode,可以直接encode为其他编码
python2中默认为windows下的gbk,所有得非Unicode都要先decode为Unicode,然后再encode为其他的字符编码。
借图
import sys print(sys.getdefaultencoding()) #显示字符编码 a_unicode="夫风起于青萍之末" #这个是unicode格式 print(a_unicode) a_gbk=a_unicode.encode('gbk') #默认是unicode格式,转化为gbk格式 print(a_gbk) a_gb2312=a_gbk.decode('gbk').encode('gb2312') #先decode转化为unicode格式,括号里告诉自己是gbk格式的,再encode转化,括号里写要转化的格式。 print(a_gb2312) #gbk是gb2312升级版,常用汉字的编码基本相同 a_unicode2=a_gbk.decode('gbk') #转化为unicode格式 print(a_unicode2)
9.day3 文件操作 seek tell 修改
打开文件的模式:
r, 只读模式【默认】
w,只写模式【不可读;不存在则创建;存在则删除内容;】
a, 追加模式【不可读;不存在则创建;存在则只追加内容;】
"+" 同时读写某个文件:
r+,可读写文件。【可读;可追加】
w+,写读
a+,追加读
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
1.read()、readline()、readlines()的区别
#!/usr/bin/env python #-*- coding:utf-8 -*- # Author:DCC# ##默认读取模式 file = open("test_file","r",encoding="utf-8") #文件句柄print(file.read()) data = file.read() #所有内容 data1 = file.read() #第二次读,是读不出数据的 file.seek(0) #将光标归零 data2 = file.read() #光标归零后就可以再出读出数据 file.close()
#!/usr/bin/env python #-*- coding:utf-8 -*- # Author:DCC file = open("test_file","r",encoding="utf-8") #文件句柄 print(file.read()) #读出全部 file.seek(0) print(file.readline()) #读出一行 file.seek(0) print(file.readlines()) #把文章内容以换行符分割,并生成list格式 C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/file.py 1如果你真的爱我 让我走开 2心疼你当初反覆那样的说 3如果你真的爱我 让我走开 4我决心不从旧梦中 挣脱 5如果你真的爱我 让我走开 6心疼你为我藏住分离的苦 7如果我知道你是这样的难过 8会一个人走向寂寞 1如果你真的爱我 让我走开 ['1如果你真的爱我 让我走开\n', '2心疼你当初反覆那样的说\n', '3如果你真的爱我 让我走开\n', '4我决心不从旧梦中 挣脱\n', '5如果你真的爱我 让我走开\n', '6心疼你为我藏住分离的苦\n', '7如果我知道你是这样的难过\n', '8会一个人走向寂寞']
file = open("test_file","r",encoding="utf-8") #文件句柄 for i in range(5): print(file.readline()) #读出前五行 file.close()
for line in file.readlines(): #转化为列表格式了 print(line.strip())
#!/usr/bin/env python #-*- coding:utf-8 -*- # Author:DCC file = open("test_file","r",encoding="utf-8") #文件句柄#将文件全部读入内存 for index,line in enumerate(file.readlines()): #读列表和下标 if index == 9: print("-----------------") continue print(line.strip()) ''' #这个效率最高,for line in file,逐行读到内存 ''' count = 0 for line in file: if count == 9: print("--------------------") count += 1 continue print(line) count += 1 '''
#!/usr/bin/env python #-*- coding:utf-8 -*- # Author:DCC ##默认读取模式 file = open("test_file","r",encoding="utf-8") #文件句柄 print(file.tell()) #打印光标当前的位置 print(file.readline()) print(file.readline()) print(file.readline()) print(file.tell()) file.seek(0) #移动归零 print(file.tell()) file.flush #刷新,从内存写到磁盘 file.close() C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/file.py 0 1如果你真的爱我 让我走开 2心疼你当初反覆那样的说 3如果你真的爱我 让我走开 110 0
#!/usr/bin/env python #-*- coding:utf-8 -*- # Author:DCC #修改思路:打开一个文件,从旧文件,读一行写一行,改一行,写一行 f = open("test_file","r",encoding="utf-8") f_new = open("test_file.bak","w",encoding="utf-8") for line in f: if "心疼" in line: line = line.replace("心疼","xinteng") print(line) f_new.write(line) f.close() f_new.close()
#with #python 一行不要超过80个字符,用换行\ with open("yesterday","r",encoding="utf-8") as f,\ open("yesterday2","r",encoding="utf-8") as f2: for line in f: print(line) for line2 in f2: print(line2)
10.json模块
json模块的作用之一:根据字符串书写格式,将字符串自动转换成相应格式
import json inp_str = "[11,22,33,44]" inp_list = json.loads(inp_str) # 根据字符串书写格式,将字符串自动转换成 列表类型 inp_str = ' {"k1":123, "k2": "wupeiqi"} ' # 正确的输入 切记,内部必须是 双引号 !!! #inp_str = " {'k1':123, 'k2': 'wupeiqi'}" # 错误的输入 inp_dict = json.loads(inp_str) # 根据字符串书写格式,将字符串自动转换成 字典类型
11.startswith()函数
此函数判断一个文本是否以某个或几个字符开始,结果以True或者False返回。
代码如下: text='welcome to qttc blog' print text.startswith('w') # True print text.startswith('wel') # True print text.startswith('c') # False print text.startswith('') # True
12.endswith()函数
此函数判断一个文本是否以某个或几个字符结束,结果以True或者False返回。
代码如下: text='welcome to qttc blog' print text.endswith('g') # True print text.endswith('go') # False print text.endswith('og') # True print text.endswith('') # True print text.endswith('g ') # False
判断文件是否为exe执行文件
我们可以利用endswith()函数判断文件名的是不是以.exe后缀结尾判断是否为可执行文件
代码如下: # coding=utf8 fileName1='qttc.exe' if(fileName1.endswith('.exe')): print '这是一个exe执行文件' else: print '这不是一个exe执行文件' # 执行结果:这是一个exe执行文件
判断文件名后缀是否为图片
代码如下: # coding=utf8 fileName1='pic.jpg' if fileName1.endswith('.gif') or fileName1.endswith('.jpg') or fileName1.endswith('.png'): print '这是一张图片' else: print '这不是一张图片' # 执行结果:这是一张图片