一、函数基础

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

   1、自定义函数

 def语句

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

函数变量名

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

函数体

函数执行的具体操作

返回值

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

>>> f1()
123
'111'

全局变量

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

global

全局变量在函数中可以通过alobal语句重新赋值,字典和列表等不可以
>>> NAME = "jym"
>>> def f1():
	age = 18
	global NAME
	NAME = 'jym1'
	print(age,NAME)

	
>>> f1()
18 jym1

传递参数

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

可传递参数类型

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表达式

lambda表达式创建一个对象但将其作为结果返回,lambda表达式可以用在定义简单功能的函数,
或def语句不能使用的地方。
原def语句定义的函数:
>>> def f1(a1):
	return a1 + 100

>>> f1(10)
110
lambda语句定义的函数:
>>> f2 = lambda a1: a1 + 100
>>> f2(10)
110


   2、函数实例

例1:寻找序列的交集
def intersect(seq1,seq2):
    res = []
    for i in seq1:
        if i 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、递归函数

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

        示例:

使用for循环阶乘
def f(n):
    ret = 1
    for i in range(1,n):
        ret = ret * i
    return ret

print(f(20))

使用递归
def fact(n):
    # 结束条件
    if n == 1:
        return 1

    return n * fact(n-1)

print(fact(20))


    4、内置函数(小部分)

Python 学习日记第四篇 -- 函数,文件_python

abs():取绝对值

>>> print(abs(-3))
3

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

#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():将传入的十进制数转换为十六进制

>>> bin(5)
'0b101'
>>> oct(15)
'0o17'
>>> hex(15)
'0xf'


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

>>> bool(1)
True
>>> bool([])
False


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

>>> 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():任意类型转化内字符串

>>> 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文件对象,可以作为计算机上的一个文件链接。

打开文件

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") #同时对文件可读可写


操作文件

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系列的版本可使用。

将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)