Python学习 day09

一、文件的修改

  python中修改文件,可以直接通过write实现,但这种方法均比较局限。若有需求:将文件中的某内容替换为新内容,其他内容保持不变。这种需求write理论上是可以实现的,可以将一个文件的内容读出修改后再写入,但若是原文件内容过大,则可能有内存溢出的风险,又或是程序执行过程中中断,可能造成文件内容丢失。

  若想实现文件某内容的修改,结合我们读取文件最好的方法for循环读取,是最安全科学的修改文件手段。

  因此,这里还是要说明,修改表面上看是我们将文件内容中某部分内容修改了,但实际上实现这样的结果并不一定要通过修改来实现,写程序时应牢记表面的展现与实现的内里并不一定相同。

  文件修改的常用方法:

  1、创建一个空文件

  2、将原文件内容逐行读取,若遇到修改内容进行修改,然后逐行写入创建的空文件

  3、删除原文件

  4、将创建的新文件文件名修改为原文件名

  原文件内容:

  代码:

import os

# 将‘阴’替换为‘晴’
with open('日志', 'r', encoding='utf-8') as f1, open('日志.bak', 'w', encoding='utf-8') as f2:
    for line in f1:
        if '' in line:
            line = line.replace('', '')
        f2.write(line)
# 删除原文件,重命名新文件
os.remove('日志')
os.rename('日志.bak', '日志')

  结果:

二、函数

  函数,即方法,主流语言应该都有的,将一段实现某功能的代码封装在一起形成一个函数,需要使用该代码时,只需调用函数即可。

  python中函数的定义方法:

def 函数名(参数):  #参数可写可不写
    函数体
    return 返回值  #可写可不写

  注意:python中的函数与java等编译型语言不同的地方,函数必须在调用前声明,python解释器始终是从上到下工作的,若函数声明在调用后面,则调用自然会报错。

三、返回值

  返回值基本同其他语言一样,但有一点不同,python可以直接返回多个值。分如下3种情况:

  1、没有返回值  ——  python种默认返回None

    不写return

    只写return

    return None  ——  多此一举

  2、返回一个值

    可以返回任何数据类型

    只要返回就可以接收到

    如果在一个程序中有多个return,那么执行程序运行过程中遇到的第一个

  3、返回多个值

    用多个变量接收  ——  有多少返回值就用多少变量接收

    用一个变量接收  ——  得到的是一个元祖

ps:python可以返回多个值也是得益于其自带的解包机制,如a, b = [1, 2],python解释器会自动将[1, 2]解包并分别赋值给a, b两个变量,包括tuple、dict、set都是可以解包的。其实这真是很容易让人理解和接收的一种特性,却是目前自己所知的语言里独有的,python真的对代码做了很多优化。

四、参数

  • 形参(以下是按实际函数定义时参数顺序介绍)

  1、位置参数 —— 直接定义参数,必须传

def func(a)

    a即位置参数

  2、*args —— 可以接收任意多个未知参数,接受的是按照位置传参的值,组成一个元祖,动态参数

def func(*args):  # 习惯用args作为参数名
    print(args)

func(
1, 2, 3)

    结果:

    可看到,传入的参数被封装为一个元祖,python有解包自然有封包

    对于列表,如果想将其每个元素作为参数传给动态参数,可以这么传:

li = [1, 2, 3]
func(*li)

    set、tuple、dict(但dict只能得到键)同理

  3、默认参数 —— 可不传,如果不传就使用默认的参数

def func(a=1)

    默认参数一般用于我们调用函数时,某个变量大部分情况都可能传递一个相同的值,只有少数情况会传递其他值,使用默认参数就可以在传参时少传一个参数了。

  4、**kargs —— 可以接收多个按关键字传参的值,组成一个字典,动态参数

def func(**kwargs):  # 习惯用kwargs作为参数名
    print(kwargs)


func(k1='v1', k2='v2', k3='v3')

   按关键字传参极类似dict的键值对,所以对于dict,想将其键值对分开一一作为参数传入,可以如下传参:

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
func(**dic) 
  • 实参

  1、按照位置传参:直接写参数值

  2、按照关键字传参:关键字 = 值

  3、可以混用,但是,必须先按照位置传参,再按照关键字传参

  4、不管用哪种传参方式,都必须保证一一对应,每个变量都有且仅有一个值

注意:形参的定义方式和实参的传参方式并没有直接联系,形参不论定义的是位置参数还是默认参数,实参都可以选择按位置传参或按关键字传参。

函数的注释

def func(name, *args, sex='', **kwargs):
    """
    这是函数注释,此处写明函数功能,下方是参数及返回值说明
    :param name: 姓名
    :param args: 所有爱好
    :param sex: 性别,默认女
    :param kwargs: 其他信息
    :return: 无返回值
    """
    print('姓名:%s,性别:%s,爱好:%s,其他:%s' % (name, sex, args, kwargs))


func('糖糖', '喜欢吃冰淇淋', '喜欢唱歌', like='酥酥')

总结

  python的函数在定义上与其他语言基本相同,不同的地方一是可返回多个值,二是参数的多样化及传参的多样化,其实实参和形参不管是位置参数默认参数还是按位置传或按关键字传,在其特有的顺序限制下,保证了其传参调用不会混乱。对其参数的理解会更容易帮助记忆,至于顺序为什么是这样,可以自己试试就知道了。

 

posted @ 2018-09-06 17:22  蜜酥糖糖糖丶  阅读(154)  评论(0编辑  收藏  举报