注释
#coding = utf-8
首先,我们不应该为怪异的逻辑添加注释,因为本身设计的很反人类的逻辑应该被重构成易读、易懂的代码,注释并不应该为此买单;其次,一看就显而易见的东西不需要注释,特别是看命名就显然可以理解的内容,是不应该出现在注释中的;最后要注意,不要在注释中描述程序的运行过程,因为这样做往往没有任何意义,未来的你和其他合格程序员应该都可以自己完成简单的运行过程分析。
当然,我们同时需要了解什么情况下应该写注释。程序注释有一部分是文档性的,包括了模组的开源证书说明、非极短函数或者类的说明等,很多情况下,这些注释不仅给人类程序员阅读,也会用于自动化生成更漂亮的文档;其次,对于一些复杂的算法,我们也是有必要在注释里进行解释的;另外,对于一些现在代码不完美或未来要写的东西,我们可以写一些 TODO 注释。
同时,Python 提供了另外一种让局部程序不被执行的方式,你可以在你希望不被执行的代码块前后两行分别加上’’’
这样的三个单引号。有的地方会称这种方式为多行注释,但是我们并不建议用于添加注释内容时使用,而建议你仅在需要让部分代码暂时不被执行时临时使用这个方式让程序避开这部分的执行。
python 允许 1< a < 100这样的语法
列表 []
list = ['sd','sdsd']
list.append() //添加一个
list.extend(x)将x列表添加到 list后面
list.index()//get index
list.insert(pos,x) insert into precisely position
list.pop(pos) // pop precisely item in pos
list.remove(x)
//字符串的分割,拼接
manager = 'tuotatianwang,taibaijinxing,juanliandajiang'
manager_list = manager.split(',')
print (manager_list)
new_manager = ' '.join(manager_list)
print (new_manager)
遍历
for num in garden:
total += num
print num
for x in range(10): //默认从0开始
print(x)
for x in range(1,10): //从1开始
print(x)
for x in range(1,10,2): // 间隔为2
print(x)
for x in range(10,1,-2):
print(x)
xrange 效率高,推荐使用
小题目。列出FIB的前50项,并且储存
# coding = utf-8
f = [0,1]
for x in range(2,51):
tmp = f[x-1] + f[x-2]
f.append(tmp)
t = raw_input()
print f[long(t)]
排序
numbers = [1, 4, 2, 3, 8, 3, 0]
numbers.sort()
print numbers
注意 sort函数并不带有返回值
numbers = [1, 4, 2, 3, 8, 3, 0]
print sorted(numbers)
print sorted(numbers,reverse=True)
待返回值的sorted函数,注意sorted是个全局函数
python自定义排序
def china_first(item):
if item == 'China':
return 0
else:
return len(item)
country = ['jp', 'China', 'USA', 'Thai']
print sorted(country,key = len)
print sorted(country,key = china_first)
元组(tuple)是一个固定大小的一组元素,比如说 (x,y) 坐标。元组看起来有点像列表,但是它的大小是固定的,不会改变的。有的时候人们会觉得它有点像是 Python 中的结构体(一种在很多语言中可以人工定义的储存结构),不仅因为它的大小是固定的,而且它还可以体现出一定的逻辑性。
元组是固定的,经常被用作函数返回值返回多个值的时候,就返回一个元组
如果创建一个只有 1 个元素的元组,则第一个元素的后面需要加一个逗号tuple = ('hi',)
。
元组作为返回值例子
def plus_one(tuple):
return tuple[0] + 1, tuple[1] + 1, tuple[2] + 1
t = (1, 4, -1)
(x,y,z) = plus_one(t)
print x
print y,z
小测验,交叉排序
输入一行 k 个用空格分隔开的整数,依次为 n1, n2 … nk。请将所有下标不能被 3 但可以被 2 整除的数在这些数字原有的位置上进行升序排列,此外,将余下下标能被 3 整除的数在这些数字原有的位置上进行降序排列。
输出包括一行,与输入相对应的若干个整数,为排序后的结果,整数之间用空格分隔。
样例输入
1 5 4 3 10 7 19
样例输出
1 3 7 5 10 4 19
提示信息
请注意,题面中的下标是从 1 开始的哦!
另外,对于读入的数 x 建议通过int(x)
转成整数以后,这道题就不难做啦。
s = raw_input()
tt = s.split()
t = []
for x in tt:
t.append(int(x))
tmp=[]
tmp2=[]
for i,x in enumerate(t):
if(i+1)%2==0 and (i+1)%3!=0:
tmp.append(x)
elif(i+1)%3 == 0:
tmp2.append(x)
#print(len(tmp))
tmp = sorted(tmp)
tmp2 = sorted(tmp2,reverse = True)
for i,x in enumerate(t):
if(i+1)%2==0 and (i+1)%3!=0:
t.pop(i)
t.insert(i,tmp.pop(0))
elif(i+1)%3 == 0:
t.pop(i)
t.insert(i,tmp2.pop(0))
for x in t:
print x,
小测验
给定一个数组,找到两个数,使得他们的和为一个给定的数值target。
函数twoSum返回两个数字index1,index2,
其中:number[index1] + number[index2]==target;
注意:index1必须小于index2且不能为0假设每一组输入只有唯一的一组解。
格式:第一行输入一个数n,接下来的两行分别输入数组number[n]和target,返回index1和index2.
样例输入
3 5 75 25 100
样例输出
2 3
n = int(raw_input())
arr = []
tmp = raw_input()
target = int(raw_input())
arr = tmp.split(' ')
arr2 = []
for i in arr:
arr2.append(int(i))
ff = 0
for i,x in enumerate(arr2):
for j,y in enumerate(arr2):
if i < j and x + y ==target:
print i+1,j+1
ff = 1
break
if ff == 1:
break
统计字符个数,1A!
输入一行字符,分别统计出其中英文字母,数字,空格,其它字符的个数。
输入格式
输入一行字符
输出格式
输出为一行,分别输出英文字母,数字,空格,其它字符的个数,用空格分隔
样例输入
aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
样例输出
23 16 2 4
str = raw_input()
char = 0
num = 0
space = 0
other = 0
slen = len(str)
for i in str:
if 'z'>= i >='a' or 'Z'>=i>='A':
char+=1
if '9'>=i>='0':
num+=1
if i == ' ':
space +=1
print char ,num ,space,slen-char-num-space
正则表达式。
运用大括号划分group匹配
import re
str = 'purple alice-b@jisuanke.com monkey dishwasher'
match = re.search('([\w.-]+)@([\w.-]+)',str)
if match:
print match.group()
print match.group(1)
print match.group(2)
查找所有匹配
除了我们之前用到的 search 方法,在结合圆括号后,我们还可以使用另一个名为 findall 的方法来匹配查找出所有的被查找字符串符合正则的结果,并得到一个结果元组为元素的列表。
import re
str = 'purple alice@jisuanke.com, blah monkey bob@abc.com blah dishwasher'
tuples = re.findall(r'([\w\.-]+)@([\w\.-]+)',str)
print tuples
在用于正则表达式的 re 模组中的函数有一些可选参数,我们可以对 search() 函数或者 findall() 函数传入额外的参数来进行使用,如 re.search(pat, str, re.IGNORECASE)
中的 re.IGNORECASE
就是使用了 re 中的一个标记作为额外的参数。
在 re 模组中,提供了很多不同的可选参数,其中上面提到的IGNORECASE
表示了让匹配时忽略大小写的区别;而另外一个可选参数DOTALL
如果被添加,则会允许正则中的.
去跨行匹配,加了这个参数以后.*
这样的匹配方式,将可以跨行进行匹配,而不只是在行内进行。另外,还有一个可选参数是MULTILINE
,使用它以后,对于一个多行文本组成的字符串,^
和$
将可以用于匹配每一行的开始和结束,而如果没有用它时^
和$
只会匹配整个字符串的开始和结束。
在+或者*后加上?进行非贪婪匹配
#coding: utf-8
import re
s = "<b>foo</b> and <i>so on</i>"
match = re.findall('(<.*>)',s)
print match
# answer: <b>foo</b> and <i>so on</i> default greedy match
match = re.findall ('(<.*?>)',s)
print match