鱼C论坛

 找回密码
 立即注册
查看: 1595|回复: 2

关于函数封装问题

[复制链接]
发表于 2018-1-29 14:15:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

count = 1
boy = []
girl = []

f = open('G://record.txt')

for eachline in f:
    if eachline[:6] != '======':
        (role,line_spoke) = eachline.split(':',1)
        if role == '小客服':
             boy.append(line_spoke)
        if role == '小甲鱼':
             girl.append(line_spoke)
    else:
        boy_part_name = 'boy_'+ str(count) + '.txt'
        girl_part_name = 'girl_' + str(count) + '.txt'
        boy_file = open(boy_part_name,'a')
        girl_file = open(girl_part_name,'a')
        boy_file.writelines(boy)
        girl_file.writelines(girl)
        boy_file.close()
        girl_file.close()
        boy = []
        girl = []
        count += 1

boy_part_name = 'boy_'+ str(count) + '.txt'
girl_part_name = 'girl_' + str(count) + '.txt'
boy_file = open(boy_part_name,'a')
girl_file = open(girl_part_name,'a')
boy_file.writelines(boy)
girl_file.writelines(girl)
boy_file.close()
girl_file.close()     
f.close()

改用函数封装:

我的写法是

def save_file():
    boy_part_name = 'boy_'+ str(count) + '.txt'
    girl_part_name = 'girl_' + str(count) + '.txt'
    boy_file = open(boy_part_name,'a')
    girl_file = open(girl_part_name,'a')
    boy_file.writelines(boy)
    girl_file.writelines(girl)
    boy_file.close()
    girl_file.close()
   

def split_file(file_name):
    count = 1
    boy = []
    girl = []

    f = open(file_name)

    for eachline in f:
        if eachline[:6] != '======':
            (role,line_spoke) = eachline.split(':',1)
            if role == '小客服':
                boy.append(line_spoke)
            if role == '小甲鱼':
                girl.append(line_spoke)
        else:
            save_file()
            boy = []
            girl = []
            count += 1


    save_file()      
    f.close()

split_file('G://record.txt')

运行后报错
Traceback (most recent call last):
  File "G:\029.py", line 37, in <module>
    split_file('G://record.txt')
  File "G:\029.py", line 28, in split_file
    fun()
  File "G:\029.py", line 3, in fun
    boy_part_name = 'boy_'+ str(count) + '.txt'
NameError: name 'count' is not defined

正确写法:
def save_file(boy,girl,count):
    boy_part_name = 'boy_'+ str(count) + '.txt'
    girl_part_name = 'girl_' + str(count) + '.txt'
    boy_file = open(boy_part_name,'a')
    girl_file = open(girl_part_name,'a')
    boy_file.writelines(boy)
    girl_file.writelines(girl)
    boy_file.close()
    girl_file.close()
   

def split_file(file_name):
    count = 1
    boy = []
    girl = []

    f = open(file_name)

    for eachline in f:
        if eachline[:6] != '======':
            (role,line_spoke) = eachline.split(':',1)
            if role == '小客服':
                boy.append(line_spoke)
            if role == '小甲鱼':
                girl.append(line_spoke)
        else:
            save_file(boy,girl,count)
            boy = []
            girl = []
            count += 1


    save_file(boy,girl,count)      
    f.close()

split_file('G://record.txt')


我不理解 封装过后无非就是形成了一个闭包,在内部函数save_file()里,对外部作用域(但不是在全局作用域)的变量(boy,girl,count)进行引用,为什么会显示count 、boy 、girl 未被定义呢?
求指教
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-29 14:17:37 | 显示全部楼层
这里牵扯的是函数的数据存储形式,一般都是将其所需的变量用栈来存放的,不同的函数使用不同的栈
所以一个栈内的数据是无法直接被其他栈直接使用的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 14:45:24 | 显示全部楼层
首先 你这里并没有闭包 只是在函数里调用另一个函数 闭包是定义在函数里的函数(闭包是定义在作用域里的作用域)

你遇到的问题就是参数存在的意义 因为你要操作的变量count等不是全局变量在函数内是没有办法操作的

实质就像楼上说的

表面上函数就是个黑盒子完成一定的功能 或可传入参数 或可返回值

你的函数 要把什么怎么样 总要有个什么 这个时候就要用参数

但是要是只是你的函数要做什么 比如要关机 就可以无参数的函数像你的代码一样 但是只要用到非全局的变量 就要用参数了

http://www.jb51.net/article/81217.htm 深入了解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-27 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表