rt
lz是从java转型到Python的,这里就把前面一些东西小结一下了。
在windows下,大家平时都是用IDLE进行开发的,lz也就用这个来讲了。
配置环境什么的都很简单,大家直接度娘就ok了。
下面主要说一下在具体编写的时候遇到的问题。
顺便吐槽一下,真的,可以提交python的oj太少了,国内大部分ok或许都没有吧,大概看了几个常用的也就codeforces可以,lz刷的毕竟比较少啊。最近因为看到貌似很多人都在耍LeerCode上面的题目,目测了几道,感觉难度不大,倒可以顺便用这个练练python。
一、输入输出
这个要先提一下。做oj最头疼的是这个了。试了一下,感觉和java比起来好像不是那么的友好。估计以后做oj的日子会很苦。
我安装的是python 3.X,而不是python 2.X。细心的朋友会发现中间有很多变化。先提个最常见的变化,输入的变化:
python 2.X的input()和python3.X的eval(input())功能相同:将你所输入的东西看做程序代码,你输什么它就返回什么,所以你要输入字符串就要自己加引号,不加引号则是变量,所以有时候会出现类似未定义的错误信息。
python 2.X的raw_input()和python 3.X的input()功能相同:将你输入的东西看做一个字符串,其返回值是在你所输入的东西外边加上引号的字符串。
二、构造函数
很奇怪的一点,在Python当中,所有的函数,包括构造函数,都必须加上一个self参数,其实不一定要叫self,只不过默认了。
那么下面问题来了,因为还有默认参数的问题
代码:
class Person:
def __init__(self):
self.name = 'Jack0'
self.age = 0
def __init__ (self, a = 1000):
self.name = 'Jack3'
self.age = a
def __str__(self):
return "Person (%s,%s)" % (self.name,self.age)
def __repr__(self):
return str(self)
结果:
>>> p = Person()
>>> p
Person (Jack3,1000)
>>>
很容易进行一种猜测:参数多的把参数少的覆盖了
继续代码:
def __init__(self):
self.name = 'Jack0'
self.age = 0
def __init__(self, n = 'Jack1'):
self.name = n
self.age = 10
def __init__ (self, a = 1000):
self.name = 'Jack3'
self.age = a
结果:
>>> p = Person()
>>> p
Person (Jack3,1000)
>>>
继续实验,代码:
结果:
def __init__(self):
self.name = 'Jack0'
self.age = 0
def __init__(self, n = 'Jack1'):
self.name = n
self.age = 10
结果:
>>> p = Person()
>>> p
Person (Jack1,10)
>>>
看来默认参数多的把参数少的覆盖了很对啊……那么问题来了,都只是一个默认参数怎么办?
代码:
def __init__(self):
self.name = 'Jack0'
self.age = 0
def __init__(self, n = 'Jack1'):
self.name = n
self.age = 10
def __init__(self, n = 'Jack2', a = 100):
self.name = n
self.age = a
结果:
>>> p = Person()
>>> p
Person (Jack2,100)
>>>
这个的结果感觉和位置有关系?那么再把两个倒过来一下试试,代码:
def __init__(self):
self.name = 'Jack0'
self.age = 0
def __init__(self, n = 'Jack2', a = 100):
self.name = n
self.age = a
def __init__(self, n = 'Jack1'):
self.name = n
self.age = 10
结果:
>>> p = Person()
>>> p
Person (Jack1,10)
>>>
好像不是和默认参数的数目有关系,而是和构造函数的位置相关。小伙伴惊呆了!最后的实验
代码:
def __init__(self, n = 'Jack2', a = 100):
self.name = n
self.age = a
def __init__(self, n = 'Jack1'):
self.name = n
self.age = 10
def __init__ (self, a = 1000):
self.name = 'Jack3'
self.age = a
def __init__(self):
self.name = 'Jack0'
self.age = 0
结果:
>>> p = Person()
>>> p
Person (Jack0,0)
>>>
总结:
和小伙伴彻底惊呆的结果。原来这个Python的编译竟然是和位置紧紧相关的……不过考虑到Python竟然是一个通过缩进来进行编译区分的语言……可以理解
Anyway,小伙伴在进行code的过程当中,一定要记得空行。刚刚不知道因为什么原因,出现了这个错误,IndentationError:unindent does not match any outer indentation level,后来重新排版一遍就好了。
三、字典、集合
这里用了codeforces 394A来说明一下字典。集合和字典有很多类似的,具体可以dir(set)查看。
hometeam = input()
awayteam = input()
n = int(input())
homeDict = {}
awayDict = {}
for i in range(n):
str = input().split(' ')
t = int(str[0])
team = str[1]
dict = homeDict if team=='h' else awayDict
m = int(str[2])
color = 1 if str[3]=='y' else 2
card = dict.get(m) if m in dict else 0
if (card == 1 or (card + color ==2)):
dict.update({m:3})
print('%s %d %d' %(hometeam if str[1]=='h' else awayteam,m,t))
elif(card==0):
dict.update({m:1})
#del dict[m]
#dict.pop(m)
#dict.update({m:1}) 强制更新
#dict.setdefault(m,1)
有的话就不修改了
基本部分就只做着一些说明了,还有类似property的东西到后面做项目的时候再详解。