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 '这不是一张图片'
# 执行结果:这是一张图片
转载于:https://blog.51cto.com/xiaofengcanyue/1837053