波大大12138 发表于 2020-6-30 16:51:04

52讲的课后作业的疑问

1.第3个判断长度的
>>> a = , None]
>>> print(len(a))
为什么【】和None都占了长度啊?他们不是表示是空的吗?但是我写a='' 的话,len(a)它的长度是0啊,这个怎么判断?
2.第六题判断代码内容的
values =
nums = set(values)

def checkit(num):
    if num in nums:
      return True
    else:
      return False

for i in filter(checkit, values):
print(i, end=' ')
这里的num取值到底是多少呢?如果取1的话被过滤的话之后就只剩下【2,3,5】了啊?就不是答案说的【1,1,2,3,5】了啊?
3.第八题代码打印什么内容
class A:
    def __init__(self, x):
      self.x = x

a = A(100)
a.__dict__['y'] = 50
print(a.y + len(a.__dict__))
这里的a.y中的y属性哪来的?题目中给的是'y'这一个是字典里的元素啊怎么可以用a.y的?这个答案不清楚怎么得到52的,没看懂
4.还有就是元祖的问题,我直接type('cherry',)的答案是字符串而temp='cherry',
                                                                                          type(temp)就是元组了有什么区别吗?

Twilight6 发表于 2020-6-30 17:08:21





为什么【】和None都占了长度啊?他们不是表示是空的吗?但是我写a='' 的话,len(a)它的长度是0啊,这个怎么判断?

单独的对 '' 判断长度肯定是 0 呀,以为这个字符串里面没有元素 ,而你判断 [''] 这样就会发现 len 结果是 1

这里表示的是一个列表内有个元素是空字符串,None 同理,虽然他的意义是空,但是也算个元素

2.第六题判断代码内容的
这里的num取值到底是多少呢?如果取1的话被过滤的话之后就只剩下【2,3,5】了啊?就不是答案说的【1,1,2,3,5】了啊?

num 的值是在 filter(checkit,values)这里传入的

filter 第一个参数是函数,第二个是可迭代对象,他会将可迭代对象的参数 一个个拿出来传入到前面一个参数

也就是前面的那个函数中去,一个个判断是否在 nums 集合中,若在则返回 True 则 filter 接受这个True结果,就将这个值保留下来,若不在则返回 False,filter 就将其过滤掉

3.第八题代码打印什么内容
这里的a.y中的y属性哪来的?题目中给的是'y'这一个是字典里的元素啊怎么可以用a.y的?这个答案不清楚怎么得到52的,没看懂

__dict__ 属性是查看对象内部所有的属性与其对应的值,返回的是字典

这里 a.__dict__['y'] = 50 就等于将 __dict__ 字典里增加了一个 'y' 对应的值为 50 到实例对象a 中去,a.y 就是这个时候添加进去的

你可以试试这个代码,就知道为什么返回的是 52:
class A:
    def __init__(self, x):
      self.x = x
a = A(100)
print('a 实例对象中所有的属性名和对应的值:',a.__dict__)
a.__dict__['y'] = 50
print('a 实例对象中所有的属性名和对应的值:',a.__dict__)

运行后你会发现 第二次调用__dict__属性时候 返回的是 两个 key:value ,所以 len(a.__dict__) 就 等于 2 了

而原来的 y 对应的值是 50 所以相加 就是调用 52 了

4.还有就是元祖的问题,我直接type('cherry',)的答案是字符串而temp='cherry', type(temp)就是元组了有什么区别吗?

逗号是元组的标志,你记住这种用法就好,temp='cherry',等价于 temp=('cherry',)



波大大12138 发表于 2020-7-1 09:36:53

Twilight6 发表于 2020-6-30 17:08
单独的对 '' 判断长度肯定是 0 呀,以为这个字符串里面没有元素 ,而你判断 [''] 这样就会发现 ...

1.那个元祖的问题我举的两个例子都是有逗号的啊,具体代码可以看下这个
>> type('cherry',)
<class 'str'>
>>> temp='cherry',
>>> type(temp)
<class 'tuple'>
我搞不明白为什么他们都有逗号但是类型不一样?
2.第三个问题运行你的代码后看懂了但是不明白的是为什么他的属性明明是x放进字典里就加了引号变成了‘x’
呢?那个y在字典里也是'y'为什么出来调用的时候就变成了a.y不加引号了呢?我想问一下引号在这里的用法?

Twilight6 发表于 2020-7-1 09:42:07

波大大12138 发表于 2020-7-1 09:36
1.那个元祖的问题我举的两个例子都是有逗号的啊,具体代码可以看下这个

我搞不明白为什么他们都有逗号 ...

type('cherry',)
的逗号是指 type 参数间的括号,不属于 'cherry'

你直接填 x 的表示 x 的值,而字典需要你的属性名,而不是你的属性的值,所以不能直接 x ,否则表示的是 x变量

举个例子x = 5
然后你字典如果是{x:5}

因为 x = 5 所以等价于 {5:5} 这样就不是我们的目的了,当你描述个变量名的时候 也要加上引号才能描述

波大大12138 发表于 2020-7-1 09:55:46

Twilight6 发表于 2020-7-1 09:42
type('cherry',)
的逗号是指 type 参数间的括号,不属于 'cherry'



那像这个代码怎么理解加引号的作用呢
dict1 = {}
dict1 = 1
dict1['1'] = 2
dict1 = 3

result = 0
for each in dict1:
    result += dict1

print(result)

Twilight6 发表于 2020-7-1 09:56:28

波大大12138 发表于 2020-7-1 09:55
那像这个代码怎么理解加引号的作用呢

1和 字符串 '1' 是两个不同的值

波大大12138 发表于 2020-7-1 10:06:12

Twilight6 发表于 2020-7-1 09:56
1和 字符串 '1' 是两个不同的值

那1和1.0这两个计算的时候保留谁的值呢?为什么?

Twilight6 发表于 2020-7-1 10:07:33

波大大12138 发表于 2020-7-1 10:06
那1和1.0这两个计算的时候保留谁的值呢?为什么?

保留先出现的那个,后续的会因为键相同而过滤掉

波大大12138 发表于 2020-7-1 10:12:48

Twilight6 发表于 2020-7-1 10:07
保留先出现的那个,后续的会因为键相同而过滤掉

虽然保留的是先出现的那个1,但是它对应的是后出现的那个1.0的值,键被过滤掉但是值由后出现的覆盖前面出现的值对吗?

波大大12138 发表于 2020-7-1 10:20:14

Twilight6 发表于 2020-7-1 10:07
保留先出现的那个,后续的会因为键相同而过滤掉

>>> a={1.00:123,1:11}
>>> a
{1.0: 11}
这个出来的怎么是1.0而不是1.00呢?

Twilight6 发表于 2020-7-1 10:21:33

波大大12138 发表于 2020-7-1 10:12
虽然保留的是先出现的那个1,但是它对应的是后出现的那个1.0的值,键被过滤掉但是值由后出现的覆盖前面出 ...

不对,是因为 1.0 键就是指 1 所以你对 1 重新赋值才会覆盖原先的值

波大大12138 发表于 2020-7-1 10:51:26

波大大12138 发表于 2020-7-1 10:20
这个出来的怎么是1.0而不是1.00呢?

@Twilight6

Twilight6 发表于 2020-7-1 10:52:14

波大大12138 发表于 2020-7-1 10:51
@Twilight6

这个不是重新赋值 不会覆盖原有的值
页: [1]
查看完整版本: 52讲的课后作业的疑问