一、函数基础

   函数是将一些语句集合在一起的部件,可在程序中多次运行;函数是为了最大程度的代码重用;函数能以多种形式接收传递的参数,并返回不同的值。

   1、自定义函数

 def语句

1
def 语句将创建一个函数对象并将其赋值给一个变量名。

函数变量名

1
def 语句在首行定义函数名,赋值给函数对象,并可在括号中传递参数

函数体

1
函数执行的具体操作

返回值

1
2
3
4
5
6
7
8
函数是通过 return 语句将运行代码得倒的值传递给调用者,返回值成为函数调用的结果
>>>  def  f1():
     print ( 123 )
     return "111"
 
>>> f1()
123
'111'

全局变量

1
2
在函数之外的模块文件中顶层书写的变量为全局变量,全局变量可以被函数读取,全局变量在函数体中
可以被修改,但不能被重新赋值。全局变量变量名最好为大写。

global

1
2
3
4
5
6
7
8
9
10
11
全局变量在函数中可以通过alobal语句重新赋值,字典和列表等不可以
>>> NAME  =  "jym"
>>>  def  f1():
     age  =  18
     global  NAME
     NAME  =  'jym1'
     print (age,NAME)
 
     
>>> f1()
18  jym1

传递参数

1
参数通过赋值传递给函数,参数的传递为对象引用,即修改传递的对象可以改变调用者共享的对象。

可传递参数类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
1 、普通参数:严格按照顺序,将实际参数赋值给形式参数
>>>  def  f1(k1,k2):
     print (k1,k2)
 
     
>>> f1( 'name' , 18 )
name  18
 
2 、指定参数:将实际参数赋值给指定的形式参数
>>>  def  f1(k1,k2):
     print (k1,k2)
 
     
>>> f1(k1 = 'jym' ,k2 = 18 )
jym  18
 
3 、默认参数:必须放置在参数列表的最后
>>>  def  f1(k1,k2,k3 = 'ok' ):
     print (k1,k2,k3)
 
     
>>> f1( 'jym' , 18 )
jym  18  ok
>>> f1( 'jym' , 18 , 'OK' )
jym  18  OK
 
4 、动态参数   *    接受任意形式的实际参数,默认将传递的参数,全部放置于元组中
>>>  def  f1 ( * args):
     print (args, type (args))
 
     
>>> f1( 11 , 22 , 33 , 'gg' )
( 11 22 33 'gg' ) < class  'tuple' >
 
>>> l1  =  [ 11 , 22 , 33 , 'gg' ]
>>> f1( * l1)
( 11 22 33 'gg' ) < class  'tuple' >
 
5 、动态参数   * *  接受指定参数,默认将传递的参数,全部放置于字典中
>>>  def  f1( * * args):
     print (args, type (args))
 
     
>>> f1(s1 = 'dict' ,s2 = 18 )
{ 's1' 'dict' 's2' 18 } < class  'dict' >
>>> dic  =  { 'k1' : 'v1' , 'k2' : 'v2' }
>>> f1(kk = dic)
{ 'kk' : { 'k1' 'v1' 'k2' 'v2' }} < class  'dict' >
>>> f1( * * dic)
{ 'k1' 'v1' 'k2' 'v2' } < class  'dict' >
 
6 、组合参数
>>>  def  f1( * args, * * kwargs):
     print (args, type (args))
     print (kwargs, type (kwargs))
 
     
>>> f1( 11 , 22 ,k1 = 'v1' ,k2 = 'v2' )
( 11 22 ) < class  'tuple' >
{ 'k1' 'v1' 'k2' 'v2' } < class  'dict' >


lambda表达式

1
2
3
4
5
6
7
8
9
10
11
12
lambda 表达式创建一个对象但将其作为结果返回, lambda 表达式可以用在定义简单功能的函数,
def 语句不能使用的地方。
def 语句定义的函数:
>>>  def  f1(a1):
     return  a1  +  100
 
>>> f1( 10 )
110
lambda 语句定义的函数:
>>> f2  =  lambda  a1: a1  +  100
>>> f2( 10 )
110


   2、函数实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
例1:寻找序列的交集
def intersect(seq1,seq2):
     res = []
     for  in  seq1:
         if  in  seq2:
             res.append(i)
     return  res
 
 
 
例2:简单的提示用户注册或登录
def login(username,password):
     '' '
     For the user log  in
     :param username: user input 
     :param password: user input
     : return : True success, False failure
     '' '
     user_db =  open ( "user_db" , 'r' )
     for  line  in  user_db:
         line_list = line.strip(). split ( ":" )
         if  line_list[0] == username and line_list[1] == password:
             return  True
     return  False
 
 
def register(username,password):
     '' '
     Used to user registration
     :param username: user input username
     :param password: user input password
     : return : None
     '' '
     user_db =  open ( "user_db" 'a' )
     temp =  "\n" +username +  ":"  + password
     user_db.write(temp)
     user_db.close()
 
 
def main():
     login_msg = input( "1:login; 2:register :" )
     if  login_msg ==  "1" :
         username = input( "please input your name:" )
         password = input( "please input your password:" )
         ret_login = login(username,password)
         if  ret_login:
             print( "login success..." )
         else :
             print( "login failure..." )
     elif  login_msg ==  "2" :
         username = input( "please input your name:" )
         password = input( "please input your password:" )
         register(username,password)
 
main()

     3、递归函数

        在函数的内部调用自身本身,这就是递归函数,但要注意的是,递归效率低,最好使用循环解决问题

        示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
使用 for 循环阶乘
def  f(n):
     ret  =  1
     for  in  range ( 1 ,n):
         ret  =  ret  *  i
     return  ret
 
print (f( 20 ))
 
使用递归
def  fact(n):
     # 结束条件
     if  = =  1 :
         return  1
 
     return  *  fact(n - 1 )
 
print (fact( 20 ))


    4、内置函数(小部分)

wKiom1ipp5zzRB-JAAKbDCcAqK4074.png

abs():取绝对值

1
2
>>> print(abs(-3))
3

all(),any() : 判断可迭代对象的真假

1
2
3
4
5
6
7
8
9
10
11
#all() 全部为真,就为真,包含可迭代对象
#any() 有一个为真,就为真,包含可迭代对象
#false = 0,None,[],{},(),"",''
>>> all([1,2,3,4])
True
>>> all([0,1,2,[]])
False
>>> any(([],1,0,None))
True
>>> any([0,None,[],{},(), "" , '' ])
False


bin():将传入的十进制数转换为二进制

oct():将传入的十进制数转换为八进制

hex():将传入的十进制数转换为十六进制

1
2
3
4
5
6
>>> bin(5)
'0b101'
>>> oct(15)
'0o17'
>>> hex(15)
'0xf'


bool():判断传入的值的真假

1
2
3
4
>>> bool(1)
True
>>> bool([])
False


bytes():字符串转换为字节类型

1
2
3
4
5
>>> str1 =  "余则成"
>>> bytes(str1,encoding= "utf-8" )
b '\xe4\xbd\x99\xe5\x88\x99\xe6\x88\x90'
>>> bytes(str1,encoding= "gbk" )
b '\xd3\xe0\xd4\xf2\xb3\xc9'

str():任意类型转化内字符串

1
2
3
4
5
6
7
8
>>> str(bytes(str1,encoding= "utf-8" ),encoding= "utf-8" )
'余则成'
>>> i = 111
>>> str(i)
'111'
>>> l = [1,2,3,4]
>>> print(str(l), type (str(1)))
[1, 2, 3, 4] <class  'str' >


二、内置函数之文件处理

    1、open(),创建一个Python文件对象,可以作为计算机上的一个文件链接。

打开文件

1
2
3
4
5
6
7
8
file1 =  open ( "user_db" , 'r' )   #只读,读出字符串
file1 =  open ( "user_db" , 'rb' )   #只读,读出字节类型
file2 =  open ( "user_db" , 'w' )   #写入,以字符串形式,先清空源文件
file2 =  open ( "user_db" , 'wb' )   #写入,以字节码形式,先清空源文件
file2 =  open ( "user_db" , 'x' )    #文件存在,报错,不存在,创建并只写
file3 =  open ( "user_db" , 'a' )   #追加,以字符串形式
file3 =  open ( "user_db" , 'ab' )   #追加,以字节码形式
file3 =  open ( "user_db" , 'r+' ,encoding= "utf-8" #同时对文件可读可写


操作文件

1
2
3
4
5
6
7
8
9
str1 = file1. read ()    #把整个文件读进单一字符串
str1 = file1. read (N)   #读取之后的N个字节(一或多个)到一个字符串
str1 = file1.readline()  #读取下一行(包括行末标识符)到一个字符串
li1 = file1.readlines()  #读取整个文件到字符串列表
file2.write(STR)       #写入字节字符床到文件
file2.writelines(LIST)  #把列表内所有字符串写入文件
file2.flush()          #把输出缓冲区刷到硬盘中,但不关闭文件
file2.seek(N)          #将文件指针移动至N处
file2.close()          #关闭文件


     2、文件上下文管理器

      不依赖于python自身的垃圾回收器,将文件处理代码包装到逻辑层中,在退出后可以自动关闭文件。在2.6以上,3.X系列的版本可使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
将user_db文件中的前10行写入到user_db1文件中
with  open ( 'user_db' , 'r' ,encoding= "utf-8" ) as f1,  open ( "user_db1" , 'w' ,encoding= "utf-8" ) as f2:
     times  = 0
     for  line  in  f1:
         print(line)
         times  += 1
         if  times  <=10:
             f2.write(line)
         else :
             break
将user_db文件中的全部内容写入user_db1文件中,并替换其中的字符串
with  open ( 'user_db' , 'r' ,encoding= "utf-8" ) as f1,  open ( "user_db1" , 'w' ,encoding= "utf-8" ) as f2:
     for  line  in  f1:
         new_str = line.replace( "old_str" , "new_str" )
         f2.write(new_str)