1.函数基本语法及特性

函数是什么?

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  1. 减少重复代码

  2. 使程序变的可扩展

  3. 使程序变得易维护

语法定义
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.函数参数与局部变量  

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

wKioL1esUsyQ85ZtAABeHblJ2rA475.png-wh_50


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为其他的字符编码。

借图

wKiom1esacvA6DnyAAMp8AVB0cs616.png-wh_50

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 '这不是一张图片'
     
# 执行结果:这是一张图片