Python练习题第 0007 题
https://github.com/Show-Me-the-Code/show-me-the-code
第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来
很多伙伴们的代码考虑的不全面。
作为一名专业的QA,我决定认真写个用来分析java程序代码行、空白行、注释行的Python程序!
我的程序能应对以下情况
- 没有实际有效代码的行为空白行
实际有效代码以//开头的是注释行,下面这个,是代码行
int a = 1;//note1
- /*和*/包裹的为注释行,但是如果*/后面或者/*前面还有有效代码的话,那么这一行其实是代码行。什么意思呢?举个栗子~
int aaa = 9;/*--
note 1
note 2
-*/ aaa += 1;
比如这个,它的注释行数为2,代码行数为2(这种代码风格实在不推荐,但是保不齐哪个程序猿哥哥就揍么个性~)
Talk is cheap, show you my code. 黑喂够~~
我的Python代码能够正确处理以下情况,但是,坦白地说,毕竟我做的不是解析器,跟专业的IDE相比还是差老鼻子远了。
int aaa = 9; /* //Code
note 1 //Note
*/ aaa += 1; /*~~~~~~ //Code
/*---- //Note
--*/ //Note
//Blank
/*---*/ //Note
/*---*/ /*----- //Note
/*----*/ // //Note
driver.manage().window().maximize();/*.....*/ //Code
#! /usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Sophie'
def blank_row(s):
s = s.strip("\n\r\t ")
if len(s) == 0:
return True
else:
return False
def note_row(s):
s = s.strip("\n\r\t ")
if len(s) == 1:
return "Code"
elif len(s)>=2 and s[0]=='/' and s[1]=='/':
return "Note"
elif len(s)>=2 and s[0]=='/' and s[1]=='*':
if s.rfind("*/") == -1 :
return "NoteNotEnd"
elif s.rfind("*/") == len(s) -2:
return "Note"
elif s.rfind("*/") < len(s) -2:
return note_row(s[s.rfind("*/")+2:len(s)])
elif s.rfind(";") == len(s) -1:#code
return "Code"
elif s.rfind(";")!=-1 and s.rfind(";") < len(s) -1:
if note_row(s[s.rfind(";")+1:len(s)]) == "Note":
return "Code"
elif note_row(s[s.rfind(";")+1:len(s)]) == "NoteNotEnd":
return "Code_NoteNotEnd"
elif note_row(s[s.rfind(";")+1:len(s)]) == "Code":
return "Code"
elif s.rfind(";") == -1:
if s.rfind("/*") == -1:
return "Code"
else:
return "NoteNotEnd"
def note_blank_row_count(list_of_codes):
l = len(list_of_codes)
i = 1
list_of_status=[]
# analyze the very 1st line
if blank_row(list_of_codes[0]):
list_of_status.append("Blank")
else:
list_of_status.append(note_row(list_of_codes[0]))
while i < l:
if list_of_status[i-1]=="Code" or list_of_status[i-1]=="Note"or list_of_status[i-1]=="Blank"or list_of_status[i-1]=="NoteEnd":
if blank_row(list_of_codes[i]):
list_of_status.append("Blank")
else:
list_of_status.append(note_row(list_of_codes[i]))
i += 1
continue
elif list_of_status[i-1]=="Code_NoteNotEnd"or list_of_status[i-1]=="NoteNotEnd":
pos = list_of_codes[i].rfind("*/")
if pos == -1:
i += 1
list_of_status.append("NoteNotEnd")
continue
else:
if blank_row(list_of_codes[i][pos+2:len(list_of_codes[i])-1]):
list_of_status.append("NoteEnd")
else:
list_of_status.append(note_row(list_of_codes[i][pos+2:len(list_of_codes[i])-1]))
i += 1
return list_of_status
if __name__ == '__main__':
file = open("/Users/Sophie/IdeaProjects/BBSAutoLoginReplyScreenShot/src/test.java",'r')
try:
list_of_rows = file.readlines()
finally:
file.close()
total_row = len(list_of_rows)
blank = 0
code = 0
#print total_row
analyze_result = note_blank_row_count(list_of_rows)
for i in range(len(analyze_result)):
print "row " , i+1, "~~~~",analyze_result[i]
for x in analyze_result:
if x == "Blank":
blank += 1
elif "Code" in x:
code += 1
note = total_row - blank - code
print "Total row: ", total_row, "\nBlank row: ",blank,"\nCode row: ",code,"\nNote row: ",note
被Python程序分析的java程序代码如下:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
import java.util.Calendar;
import java.util.regex.*;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.File;
public class aaa {
public static int t = 1;
public static String getDateTime(){
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmss");
return df.format(new Date());
}
public static void ScreenShot(WebDriver dr, String dir){
File screenShot = ((TakesScreenshot)dr).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenShot, new File(dir+getDateTime()+"_"+t+".jpg"));
++t;
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
System.out.println(AutoLoginReplyScreenshot.getDateTime());
WebDriver driver = new FirefoxDriver();
String loginUrl = "https://www.wacai.com/user/user.action?url=http%3A%2F%2Fbbs.wacai.com%2Fportal.php";
String basicURL ="http://bbs.wacai.com/portal.php";
String dir = "/Users/Sophie/IdeaProjects/BBSAutoLoginReplyScreenShot/ScreenShot/";
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.get(loginUrl);
driver.manage().window().maximize();
//delete all pics if there are more than 80
File file = new File(dir);
File[] fs = file.listFiles();
if(fs.length >= 80){
for(File f: fs){
if(f.getName().contains("jpg"))
f.delete();
}
}
/**
* 1st screen shot: login page
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
driver.findElement(By.id("account")).clear();
driver.findElement(By.id("account")).sendKeys("18611742186");
driver.findElement(By.id("pwd")).clear();
driver.findElement(By.id("pwd")).sendKeys("leilei20w");
driver.findElement(By.id("login-btn")).click();
driver.manage().window().maximize();
/**
*2nd screen shot: after login
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
String a = driver.findElement(By.cssSelector(".name")).getAttribute("href");
driver.get(a);
String pi = driver.findElement(By.xpath("//div[@class='userHead container']/div[@class='tabs w_tab']/nav/ul/li[5]/a")).getAttribute("href");
driver.get(pi);
/**
* 3rd screen shot: personal info
*/ int aaaiii = 0;//~~
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
driver.get(basicURL);
//get the bbs portal page, find the specific forum href
a = driver.findElement(By.linkText("签到有礼")).getAttribute("href");
driver.get(a);
/**
* 4th screen shot: check-in forum
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
//Thread title
Calendar c = Calendar.getInstance();
int m = c.get(Calendar.MONTH)+1;
int d = c.get(Calendar.DAY_OF_MONTH);
String dd = ""+d;
if (d < 10)
dd = "0"+dd;
String threadTitle = "签到有礼"+m+"."+dd+"每天签到得铜钱";
//find today's check-in thread
a = driver.findElement(By.partialLinkText(threadTitle)).getAttribute("href");
driver.get(a);
/**
* 5th screen shot: check-in thread
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
//using regrex to find the content we use to reply
Pattern p = Pattern.compile("回帖内容必须为.+</font>非此内容将收回铜钱奖励");
Matcher r = p.matcher(driver.getPageSource().toString());
StringBuffer key = new StringBuffer();
while(r.find()){
key.append(r.group());
}
//using xpath locate the textarea and submit button
driver.findElement(By.xpath("//textarea[@id='fastpostmessage']")).sendKeys(key.substring(key.indexOf(">")+1, key.indexOf("</")-1));
driver.manage().window().maximize();/*.....*/
/**
* 6th screen shot: key words
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
driver.findElement(By.xpath("//button[@id='fastpostsubmit']")).click();
/**
* 7th screen shot: after reply
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
//go to personal info page
driver.get(pi);
/**
* 8th screen shot: check the coin amount
*/
AutoLoginReplyScreenshot.ScreenShot(driver, dir);
driver.close();
System.out.println(AutoLoginReplyScreenshot.getDateTime());
int aaa = 9; /*
note 1
*/ aaa += 1; /*~~~~~~
/*----
--*/
/*---*/
/*---*/ /*-----
/*----*/ //
}
}
针对上述java代码,程序输出结果如下:
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/Sophie/PycharmProjects/Practice_0007/Practice_0007.py
row 1 ~~ Blank ~ Code
row 2 ~
row 3 ~~ Code ~ Code
row 4 ~
row 5 ~~ Code ~ Code
row 6 ~
row 7 ~~ Code ~ Code
row 8 ~
row 9 ~~ Code ~ Code
row 10 ~
row 11 ~~ Code ~ Blank
row 12 ~
row 13 ~~ Code ~ Code
row 14 ~
row 15 ~~ Code ~ Code
row 16 ~
row 17 ~~ Code ~ Code
row 18 ~
row 19 ~~ Code ~ Code
row 20 ~
row 21 ~~ Code ~ Code
row 22 ~
row 23 ~~ Code ~ Code
row 24 ~
row 25 ~~ Code ~ Code
row 26 ~
row 27 ~~ Code ~ Blank
row 28 ~
row 29 ~~ Code ~ Code
row 30 ~
row 31 ~~ Code ~ Code
row 32 ~
row 33 ~~ Code ~ Code
row 34 ~
row 35 ~~ Code ~ Code
row 36 ~
row 37 ~~ Code ~ Blank
row 38 ~
row 39 ~~ Note ~ Code
row 40 ~
row 41 ~~ Code ~ Code
row 42 ~
row 43 ~~ Code ~ Code
row 44 ~
row 45 ~~ Code ~ Code
row 46 ~
row 47 ~~ Code ~ NoteNotEnd
row 48 ~
row 49 ~~ NoteNotEnd ~ NoteEnd
row 50 ~
row 51 ~~ Code ~ Blank
row 52 ~
row 53 ~~ Code ~ Code
row 54 ~
row 55 ~~ Code ~ Code
row 56 ~
row 57 ~~ Code ~ Code
row 58 ~
row 59 ~~ Blank ~ NoteNotEnd
row 60 ~
row 61 ~~ NoteNotEnd ~ NoteEnd
row 62 ~
row 63 ~~ Code ~ Blank
row 64 ~
row 65 ~~ Code ~ Code
row 66 ~
row 67 ~~ Blank ~ Code
row 68 ~
row 69 ~~ Code ~ Blank
row 70 ~
row 71 ~~ NoteNotEnd ~ NoteNotEnd
row 72 ~
row 73 ~~ Code ~ Code
row 74 ~
row 75 ~~ Blank ~ Code
row 76 ~
row 77 ~~ Blank ~ Note
row 78 ~
row 79 ~~ Code ~ Code
row 80 ~
row 81 ~~ Blank ~ NoteNotEnd
row 82 ~
row 83 ~~ NoteNotEnd ~ NoteEnd
row 84 ~
row 85 ~~ Code ~ Blank
row 86 ~
row 87 ~~ Note ~ Code
row 88 ~
row 89 ~~ Code ~ Code
row 90 ~
row 91 ~~ Code ~ Code
row 92 ~
row 93 ~~ Code ~ Code
row 94 ~
row 95 ~~ Blank ~ Note
row 96 ~
row 97 ~~ Code ~ Code
row 98 ~
row 99 ~~ Blank ~ NoteNotEnd
row 100 ~
row 101 ~~ NoteNotEnd ~ NoteEnd
row 102 ~
row 103 ~~ Code ~ Blank
row 104 ~
row 105 ~~ Note ~ Code
row 106 ~
row 107 ~~ Code ~ Code
row 108 ~
row 109 ~~ Code ~ Code
row 110 ~
row 111 ~~ Code ~ Note
row 112 ~
row 113 ~~ Code ~ Code
row 114 ~
row 115 ~~ Blank ~ NoteNotEnd
row 116 ~
row 117 ~~ NoteNotEnd ~ NoteEnd
row 118 ~
row 119 ~~ Code ~ Blank
row 120 ~
row 121 ~~ Code ~ Blank
row 122 ~
row 123 ~~ NoteNotEnd ~ NoteNotEnd
row 124 ~
row 125 ~~ NoteEnd ~ Code
row 126 ~
row 127 ~~ Blank ~ Note
row 128 ~
row 129 ~~ Code ~ Blank
row 130 ~
row 131 ~~ NoteNotEnd ~ NoteNotEnd
row 132 ~
row 133 ~~ NoteEnd ~ Code
row 134 ~
row 135 ~~ Blank ~ Code
row 136 ~
row 137 ~~ Code ~ Blank
row 138 ~
row 139 ~~ Code_NoteNotEnd ~ NoteNotEnd
row 140 ~
row 141 ~~ Code_NoteNotEnd ~ NoteNotEnd
row 142 ~
row 143 ~~ NoteEnd ~ Blank
row 144 ~
row 145 ~~ Note ~ NoteNotEnd
row 146 ~
row 147 ~~ Note ~ Code
row 148 ~
row 149 ~~~~ Code
Total row: 149
Blank row: 24
Code row: 89
Note row: 36
Process finished with exit code 0