设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生
打印 上一主题 下一主题

集中答疑专用贴

  [复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

151#
发表于 2016-12-29 23:09:47 |只看该作者
stugpanzer 发表于 2016-12-28 20:29
我的编辑器就是系统自带的IDLE,不可能存在不支持的问题吧

虽然无反应,但输入foo(2)函数表达式,运行出 ...

直接从控制台里运行 python xxx.py 看看有没有输出
这不是支不支持,是对于输出流的不同实现

ubuntu那个问题不清楚
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

152#
发表于 2016-12-30 07:37:17 |只看该作者
crossin先生 发表于 2016-12-29 23:09
直接从控制台里运行 python xxx.py 看看有没有输出
这不是支不支持,是对于输出流的不同实现

控制台运行提示syntax error,和这个有关系吗?

话说回来如何设置才能支持多进程输出流?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

153#
发表于 2016-12-31 00:17:15 |只看该作者
stugpanzer 发表于 2016-12-30 07:37
控制台运行提示syntax error,和这个有关系吗?

话说回来如何设置才能支持多进程输出流? ...

idle就是不支持吧,我试了下也不行。

syntax error ,你查查是不是又动了代码。你原来的代码没问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

154#
发表于 2017-1-6 10:53:00 |只看该作者
本帖最后由 stugpanzer 于 2017-1-6 11:30 编辑

class Person:
         def _init_(self,name):
                  self.name=name
         def sayhello(self):
                  print (self.name)
p=Person(Bill)
p1 = Person(Apple)
print (p)
--------------
前面已经用self定义了类的初始化函数,为什么运行时提示Bill未定义?

以为是没加单引号的问题,Bill改为‘Bill’后提示TypeError: object() takes no parameters
-------------------------------------------

问题已经解决,init两边的下划线都应该是两个,但又有新的问题,我在最后加上p.sayhello调用sayhello方法,但IDLE输出框没有任何显示,也不报错,按理说应该打印出Bill的
class Person:
    def __init__(self,name):
        self._name=name
    def sayhello(self):
        print (self.name)
p=Person("Bill")
p1 = Person("Apple")
p.sayhello
--------------
改成p.sayhello()后提示AttributeError: 'Person' object has no attribute 'name'
self._name中的下划线去掉后可以运行,打印出了Bill。如果说self.__name代表私有,那么一个下划线self._name代表什么呢,而且p.sayhello和p.sayhello()的区别在哪里,如果前者错误的话应该报错,而不是不报错但也没有什么打印结果
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

155#
发表于 2017-1-6 20:46:30 |只看该作者
stugpanzer 发表于 2017-1-6 10:53
class Person:
         def _init_(self,name):
                  self.name=name

_name就是_name,不代表什么,跟你叫abc一样,一个独立的名字。和name毫无关系。

不加括号就只是函数本身,并不调用函数,就好比你在代码写了一个 'hello',既没有赋值,也没输出,不会报错。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

156#
发表于 2017-1-6 22:56:06 |只看该作者
crossin先生 发表于 2017-1-6 20:46
_name就是_name,不代表什么,跟你叫abc一样,一个独立的名字。和name毫无关系。

不加括号就只是函数本 ...

我的意思是,_name的意义如果和name相同,那么用self.name时,应该和self._name运行出同样的结果,但实验的结果是后者不显示也不报错,而前者成功打印出了Bill

(后者是点加下划线而不是只有下划线,以前学c的struct结构我记得结构体后加点和下划线都可以表示结构体中的变量,但点加下划线就不是了)
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

157#
发表于 2017-1-7 11:49:37 |只看该作者
stugpanzer 发表于 2017-1-6 22:56
我的意思是,_name的意义如果和name相同,那么用self.name时,应该和self._name运行出同样的结果,但实验 ...

用_name没有问题,效果和name是一样。
你前面没输出是因为sayhello没有被调用
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

158#
发表于 2017-1-10 17:22:24 |只看该作者
本帖最后由 stugpanzer 于 2017-1-10 17:41 编辑
crossin先生 发表于 2017-1-7 11:49
用_name没有问题,效果和name是一样。
你前面没输出是因为sayhello没有被调用 ...

这两天同时在看<c与指针>,里面有一处地方很不解,按理说++i的操作是返回i本身,不像i++返回的是一个变量temp,i++不能做左值没有什么疑问,看有的书上讲++i也可以做左值,但《C与指针》中的例子
-----------------
int *cp=ci,定义了cp是指向int类型的指针,但讲到指针操作时,却说cp++和++cp作为左值时都是非法,

cp++非法很好理解,但++cp非法的原因是“因为前缀++先增加它的操作数值再返回这个结果,这份拷贝的存储位置并未定义,所以它不是一个合法的左值(原书一字不差的打了下来)”
---------------
这让我很不解,++cp的操作本来不就是分两步进行的吗,
cp=cp+1;
return cp;
那么为什么++cp做左值时,返回的是依然是增1后的cp,并未声明新的变量,也就是说不需要新的存储地址,cp以前在什么地方现在还在什么地方,那么为什么是非法呢?
----------
从汇编层级而言,是否cp=cp+1这句操作导致了对新的存储空间的需求?但汇编层级应该是add cp 1这样的样子,cp的存储位置并未变化

还是说话说回来,其实++i无论i是数据还是指针,在C中都是不能做左值的?而在C++中可以?

看了一下++i和i++的C++汇编代码,发现都一样,
mov        eax,dword ptr
add        eax,1  
mov        dword ptr ,eax

也就是说c和c++中关于左值的合法性是截然不同的?我搜到的有的博客说c++对++i可以当左值在标准中有明确定义,而c标准中翻不到++i当左值的定义
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

159#
发表于 2017-1-10 23:30:39 |只看该作者
stugpanzer 发表于 2017-1-10 17:22
这两天同时在看,里面有一处地方很不解,按理说++i的操作是返回i本身,不像i++返回的是一个变量temp,i++ ...

c和c++对于自增运算符的实现是不一样。
http://lib.csdn.net/article/c/25445
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

160#
发表于 2017-1-16 01:40:01 |只看该作者
本帖最后由 stugpanzer 于 2017-1-16 02:22 编辑

这两天在看一个关于自动恢复被病毒感染的磁盘下的程序,病毒更改了文件夹的属性,成为系统文件并使得不可见,程序的功能是对每个文件夹实行cmd下 attrib 文件名 -s -h操作
源代码如下:
--------------------
import os

import os.path

disk = [‘c’,'d','e','f','g',]

for g in disk :

    time = 1

    number = 0

    count = 0

    lis = ['']*50

    cdir = g+':\\'      

    for name in os.listdir(cdir):            #获取到根目录文件夹下所有文件名

        lis[count] = cdir + '\\' + name            #生成所有文件的绝对路径

        count = count + 1

        cmd = 'attrib'+' '+lis[time]+' '+'-s -h'    #初始化cmd的恢复命令

    while time < 50 :                           

        c = ' ' + '&&' + ' ' + 'attrib'+' '+lis[time]+' '+'-s -h'

        cmd = cmd + c                      #将所有文件路径添加到恢复命令中

        time = time + 1

    else :

        print "disk ",g," has been changed over"

    os.system(cmd)                         #针对每个盘符进行恢复

else :

print "all works has been done"
--------------------
这里有几个疑问(源代码是Python2的,不讨论2和3的语法不同)
1.  while time < 50 :                           

        c = ' ' + '&&' + ' ' + 'attrib'+' '+lis[time]+' '+'-s -h'
        cmd = cmd + c  
这里前面cmd已经生成了cmd窗口下要执行的命令,为什么还要c中重新再加一遍?lis(time)中已经形成了文件名,与其他字符串相加得到完整路径即可,为什么还要把cmd字符串加一遍?

我起初的思路是得到一个文件名,attrib一次,但原作者的意思似乎是得到所有文件名的attrib 文件名 -h -s命令后,一次执行完毕,是否如此?

这里又有一个问题,time初值为1,但数组是从0开始的,也就是说是否会把lis中的第一个漏掉?



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 09:13 , Processed in 0.017526 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部