1.python生成器
2.while 1:
num = input('请输入一个整数(输入Q结束程序):')
if num != 'Q':
num = int(num)
print('十进制 -> 十六进制 : %d -> 0x%x' % (num, num))
print('十进制 -> 八进制 : %d -> 0o%o' % (num, num))
print('十进制 -> 二进制 : %d -> ' % num, bin(num))
else:
break
十进制到二进制怎么实现的
3.
当时的解释:大佬说-->比如说函数计算的值在函数外面要用,那么必须加return
4.
大佬解释:return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。不带return就默认返回None。带return就是就返回return后面的表达式。None是不能做赋值右值的。单单的funY只是一个函数对象,因为funY后面有个(),就代表funY被调用的。
我的理解:有return的时候表示调用该函数并返回该函数一个值,没有return的时候只是起到调用这个函数,返回的值是默认的none。都有结束函数的意思。
*、用dir(classname)查看类中有哪些东西
用dir(instance)查看实例中有哪些东西
用__dict__查看有哪些属性
用id()查看哪些属性一样
我通过一系列测试得出结论:
类中的所有东西都“复制”实例中了包括类函数,静态函数,类变量,其实能通过实例调用相同名字的类变量
instance__class__.value
另外self是用来进行绑定用的,这点可以通过直接打印函数名能够看到哪个类的对象被绑定
另外还有继承,也可以用上述方法研究看看这些父类子类中到底有哪些东西:其实父类中所有的东西也都复制到子类中了,正是有了显示绑定才能方便的用子类实例调用父类的方法:应为子类实例绑定了父类函数
说到底,都是python的设计哲学比较好,能够用一些方法清楚的看到所有的东西,比起java来说迷迷糊糊的只能看资料了解哪些类中有什么东西,继承时,创建实例时发生了什么改变。
*、 Python里面类之间的关系可以是纵向关系,采用继承机制可以将基类里面的属性和方法全部被子类使用,而父类却不可以使用子类的方法和属性,例如鱼和鲨鱼、鲤鱼三文鱼之间的关系等;当然类之间也可以是横向关系,可以通过实例化一个类的对象来作为另一类的属性来实现类之间的调用关系,例如池塘和池塘内的鱼和乌龟之间的关系等,举例说明:
>>> class Turtle:
def __init__(self,x):
self.x = x
>>> class Fish:
def __init__(self,y):
self.y = y
>>> class Pool:
def __init__(self,x,y):
self.turtle = Turtle(x) #将Turtle类实例化的对象turtle作为类Pool实例化对象的属性
self.fish = Fish(y) #将Fish类实例化的对象fish作为类Pool实例化对象的属性
def printnum(self):
print('池塘内的乌龟有%d 只,小鱼有 %d 条!' %(self.turtle.x,self.fish.y))
>>> pool = Pool(2,10)
>>> pool.printnum()
池塘内的乌龟有 2 只,小鱼有 10 条!
*、
解释:
解释:表示false,但不等于false
*修饰符(装饰器)
*小甲鱼:class CapStr(str): -----》
def __new__(cls,string):
string=string.upper()
return str.__new__(cls,string)
错误: class CapStr(str):
def __new__(cls,string):
string=string.upper()
return str.__new__(cls,string)
def __init(self,string):
self.x=string
cs=CapStr('I love You')
cs.x
解释:小甲鱼这里只是举例说明__new__(cls)这个特殊方法的用法。在视频和书中都明确说明了绝大多数情况都不需要去改写这个特殊方法的。只有当类继承自另一个不可变类的时候才需要去改写。 至于你的第二段代码不能实现有两个地方理解有误: 你看下图我的运行结果,第一个是有 __init__的,第二个是没有__init__的。你也可以试试! |
*①__metaclass__=type
class CapString(str):
def __new__(cls,string):
string=string.upper()
return str.__new__(cls,string)
②class CapString(str):
def __new__(cls,string):
return string.upper()
解释:return string.upper() 是把计算好的结果 自己返回
return str.__new__(cls,string) 是把结果交给父类str处理返回(这样是为是防止不必要的错误发生)
再看看__new__的说明
1. __new__ 是在一个对象实例化的时候所调用的第一个方法
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用
4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string
*
*
*、怎么在shell里改name
解释:类Record()的实例对象没有返回值,这样子写的话x是属于类的属性,在创建的时候就已经被赋值了,赋的值就是那个返回值。
也就是这个样子,这个x已经是'你好'了,然而'你好'是没有 name 这个属性的,
初始化的话这个x指向的是类Record() ,这时候的self.x是一个类Record()的实例对象,所以有 name 这个属性。
*
解释:浅拷贝,浅拷贝只拷贝父对象,不拷贝里面的子对象。
http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
*
解释: ip==》119.113.112.332
*
解释:表达式里面有几组括号?只有一组。+号在括号外面。括号最多匹配到一个字符,要么是a, 要么是c,re 在单次搜索中如果命中多个分组,自保留最后的分组。他其实是匹配了a,b,c,但是c是最后匹配的,又因为只能匹配一个字符,c又把前面的覆盖了,所以为c。
扩展:
m.group() == m.group(0) 这个返回的是整个匹配的字符串"abc"