import time
#6一、簡述同源策略
'''
同源策略須要同時知足如下三點要求:
1)協議相同
2)域名相同
3)端口相同
http:www.test.com與https:www.test.com 不一樣源——協議不一樣
http:www.test.com與http:www.admin.com 不一樣源——域名不一樣
http:www.test.com與http:www.test.com:8081 不一樣源——端口不一樣
只要不知足其中任意一個要求,就不符合同源策略,就會出現「跨域」
'''
#6二、簡述cookie和session的區別
'''
1,session 在服務器端,cookie 在客戶端(瀏覽器)
二、session 的運行依賴 session id,而 session id 是存在 cookie 中的
也就是說,若是瀏覽器禁用了 cookie ,同時 session 也會失效
三、cookie安全性比session差
'''
#6三、簡述多線程、多進程
'''
進程:
一、操做系統進行資源分配和調度的基本單位,多個進程之間相互獨立
二、穩定性好,若是一個進程崩潰,不影響其餘進程
三、進程消耗資源大,開啓的進程數量有限制
線程:
一、CPU進行資源分配和調度的基本單位
二、線程是進程的一部分,是比進程更小的能獨立運行的基本單位
三、一個進程下的多個線程能夠共享該進程的全部資源
四、若是IO操做密集,則能夠多線程運行效率高
五、缺點是若是一個線程崩潰,都會形成進程的崩潰
應用:
一、IO密集的用多線程,在用戶輸入,sleep 時候,
能夠切換到其餘線程執行,減小等待的時間
二、CPU密集的用多進程,由於假如IO操做少,用多線程的話,
由於線程共享一個全局解釋器鎖,
當前運行的線程會霸佔GIL,其餘線程沒有GIL,
就不能充分利用多核CPU的優點
'''
#6四、簡述any()和all()方法
'''
any():只要迭代器中有一個元素爲真就爲真
all():迭代器中全部的判斷項返回都是真,結果才爲真
python中什麼元素爲假?
0,空字符串,空列表、空字典、空元組、None, False
'''
#65
'''
IOError、AttributeError、ImportError、IndentationError、
IndexError、KeyError、SyntaxError、NameError分別表明什麼異常?
答:
IOError:輸入輸出異常
AttributeError:試圖訪問一個對象沒有的屬性
ImportError:沒法引入模塊或包,基本是路徑問題
IndentationError:語法錯誤,代碼沒有正確的對齊
IndexError:下標索引超出序列邊界
KeyError:試圖訪問你字典裏不存在的鍵
SyntaxError:Python代碼邏輯語法出錯,不能執行
NameError:使用一個還未賦予對象的變量
'''
#6六、python中copy和deepcopy區別
'''
一、複製不可變數據類型,無論copy仍是deepcopy,都是同一個地址
二、複製的值是可變對象(列表和字典):
淺拷貝copy有兩種狀況:
1.複製的對象中無 複雜 子對象, 原來值的改變並不會影響淺複製的值
同時淺複製的值改變也並不會影響原來的值(也就是互不影響)
2.複製的對象中有 複雜 子對象,(例如列表中的一個子元素是一個列表),
改變原來的值 中的複雜子對象的值 ,會影響淺複製的值。
深拷貝deepcopy:徹底複製獨立,包括內層列表和字典
'''
#6七、列出幾種魔法方法並簡要介紹用途
'''
__init__:對象初始化方法
__new__:建立對象時候執行的方法,單列模式會用到
__str__:當使用print輸出對象的時候,只要本身定義了__str__(self)方法,那麼就會打印從在這個方法中return的數據
__del__:刪除對象執行的方法
class f:
def __str__(self):
return 'ok'
f = f()
print(f.__str__())
'''
#6八、C:Users y-wu.junyaDesktop>python 1.py 22 33命令行啓動程序並傳參,
# print(sys.argv)會輸出什麼數據?
'''
輸出文件名和參數構成的列表
['1.py','22','33']
'''
#6九、請將[i for i in range(3)]改爲生成器
'''
a = (i for i in range(3))
print(list(a))
print(type(a))
'''
#70、a = " hehheh ",去除收尾空格
'''
a = " hehheh "
a = a.strip()
print(a)
'''
#7一、舉例sort和sorted對列表排序,list=[0,-1,3,-10,5,9]
'''
list=[0,-1,3,-10,5,9]
list.sort(reverse=False)
print('從小到大的順序:',list)
ret = sorted(list,reverse=False)
print(ret)
總結:
1.sort是在原基礎上修改,沒有返回值
2.sorted有返回值,是個新的列表
'''
#7二、對list排序
# foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用lambda函數從小到大排序
'''
foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
fo = sorted(foo,key=lambda x:x,reverse=False)
print(fo) #[-20, -5, -4, -4, -2, 0, 2, 4, 8, 8, 9]
'''
#7三、使用lambda函數對list排序
# foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],輸出結果爲
#[0,2,4,8,8,9,-2,-4,-4,-5,-20],正數從小到大,負數從大到小
'''
傳兩個條件,x<0和abs(x)
當i<0的時候,按照絕對值大小進行排序,i>0的時候,正常排序
foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
fo = sorted(foo,key=lambda i:(i<0,abs(i)))
print(fo)
'''
#7四、列表嵌套字典的排序,分別根據年齡和姓名排序
'''
foo = [
{"name":"zs","age":19},
{"name":"ll","age":54},
{"name":"wa","age":17},
{"name":"df","age":23}
]
#年齡
f1 = sorted(foo,key=lambda x:x["age"])
print('按照年齡排序',f1)
#姓名
f2 = sorted(foo,key=lambda x:x["name"])
print('按照姓名排序',f2)
'''
#7五、列表嵌套元組,分別按字母和數字排序
'''
foo = [
("zs",19),
("ls",54),
("wa",17),
("df",23),
]
#按字母
f1 = sorted(foo,key=lambda i:i[0])
print(f1)
#按數字
f2 = sorted(foo,key=lambda i:i[1])
print(f2)
'''
#7六、列表嵌套列表排序,年齡數字相同怎麼辦?
'''
foo = [
["zs",19],
["ls",54],
["wa",17],
["df",19],
]
f = sorted(foo,key=lambda x:(x[1],x[0]))
print(f) #[['wa', 17], ['df', 19], ['zs', 19], ['ls', 54]]
注意:lambda函數中,若是發生了相同的條件,則根據後面的條件進行排序
'''
#7七、根據鍵對字典排序(方法一,zip函數)
'''
dic = {"name":"zs","sex":"man","city":"bj"}
#字典轉化爲列表,而且嵌套元祖
foo = zip(dic.keys(),dic.values())
f = [i for i in foo ]
#print(f) #[('name', 'zs'), ('sex', 'man'), ('city', 'bj')]
#按照鍵排序
f_sort = sorted(f,key=lambda i:i[0])
new_dic = {i[0]:i[1] for i in f_sort}
print('new_dic:',new_dic) #{'city': 'bj', 'name': 'zs', 'sex': 'man'}
--------------
78.題(方法二)
dic_sort = sorted(dic.items(),key=lambda i:i[0])
# print(dic_sort) #[('city', 'bj'), ('name', 'zs'), ('sex', 'man')]
new_dic_sort = {i[0]:i[1] for i in dic_sort}
print(new_dic_sort)
這兩種方法效果相同!
'''
#7九、列表推導式、字典推導式、生成器
'''
import random
list1 = [i for i in range(6)]
print(list) #[0, 1, 2, 3, 4, 5]
dic = {i:random.randint(1,6) for i in ["a","b","c"]}
print(dic)
a = (i for i in range(6))
print(list(a)) #[0, 1, 2, 3, 4, 5]
print(a) #<generator object <genexpr> at 0x000001696375C408>
'''
#80、最後出一道檢驗題目,根據字符串長度排序,看排序是否靈活運用
'''
s = ["ab","abc","a","dgdf"]
#第一種方法
s_sort = sorted(s,key=lambda i:len(i))
print(s_sort)
#第二種方法
s.sort(key=len,reverse=True)
print(s)
'''
import time
#8一、舉例說明SQL注入和解決辦法
'''
當以字符串格式化書寫方式的時候,若是用戶輸入的有;+SQL語句,後面的SQL語句會執行,
好比例子中的SQL注入會刪除數據庫demo
input_name = "zs;drop database demo"
sql = "select * from demo where name='%s" %input_name
print(sql)
解決方式:經過傳參數方式解決SQL注入
params = [input_name]
count = cs1.execute('select * from demo where name="%s",params)
'''
#8二、s="info:xiaoZhang 33 shandong",
# 用正則切分字符串輸出
# ['info', 'xiaoZhang', '33', 'shandong']
'''
import re
s="info:xiaoZhang 33 shandong"
s_ret = re.split(r'[:| ]',s)
print(s_ret)
'''
#8三、正則匹配以163.com結尾的郵箱
'''
email_list = ["xiaowang@163.com","xiaoming@qq.com","xiaoshuai@163.com"]
import re
for email in email_list:
email_list_ret = re.findall(r'[\w]{4,20}@163\.com$',email)
if email_list_ret:
print(email_list_ret)
else:
pass
'''
#8四、遞歸求和,遞歸完成 1+2+3+4,,,,+10的和
'''
def get_sum(num):
if num >= 1:
res = num + get_sum(num-1)
else:
res = 0
return res
res = get_sum(5)
print(res)
# res = 5 + get_sum(4)
# res = 5 + 4 + get_sum(3)
# res = 5 + 4 + 3 + get_sum(2)
# res = 5 + 4 + 3 + 2 + get_sum(1)
# res = 5 + 4 + 3 + 2 + 1 + get_sum(0)
'''
#8五、python字典和json字符串相互轉化方法
'''
import json
dic = {"name":"zs"}
ret1 = json.dumps(dic)
print(type(ret1)) #<class 'str'>
ret2 = json.loads(ret1)
print(type(ret2)) #<class 'dict'>
'''
#8六、MyISAM 與 InnoDB 區別:
'''
一、InnoDB 支持事務,MyISAM 不支持,這一點是很是之重要。事務是一種高
級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而 MyISAM
就不能夠了;
二、MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到
安全性較高的應用;
三、InnoDB 支持外鍵,MyISAM 不支持;
四、對於自增加的字段,InnoDB 中必須包含只有該字段的索引,可是在 MyISAM
表中能夠和其餘字段一塊兒創建聯合索引;
五、清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。MyISAM 則會重
建表
'''
#8七、統計字符串中某字符出現次數
"""
str = "張三 美國 小日本 哈哈 呵呵 張 三"
str_count = str.count("張三")
print(str_count) # 1
"""
#8八、字符串轉化大小寫
'''
str1 = "allen"
str1 = str1.upper()
print(str1) #ALLEN
str2 = str1.lower()
print(str2) #allen
'''
#8九、用兩種方法去空格
"""
str1 = "hello world haha hehe"
str1 = str1.split(" ")
str1 = "".join(str1)
print(str1) #helloworldhahahehe
str2 = "hello world haha hehe"
str2 = str2.replace(' ','')
print(str2) #helloworldhahahehe
"""
#90、正則匹配不是以4和7結尾的手機號
"""
import re
tels = ["332814","332817","332817","332816"]
for tel in tels:
ret = re.match('1[\d]{9}[0-3,5-6,8-9]',tel)
if ret:
print('正確的手機號碼',ret.group())
else:
print('錯誤的手機號碼',tel)
"""
#9一、簡述python引用計數機制
"""
python垃圾回收主要以引用計數爲主,
標記-清除和分代清除爲輔的機制,
其中標記-清除和分代回收主要是爲了處理循環引用的難題。
引用計數算法
當有1個變量保存了對象的引用時,此對象的引用計數就會加1
當使用del刪除變量指向的對象時,
若是對象的引用計數不爲1,好比3,
那麼此時只會讓這個引用計數減1,即變爲2,
當再次調用del時,變爲1,若是再調用1次del,此時會真的把對象進行刪除
"""
#9二、int("1.4"),int(1.4)輸出結果?
"""
print(int("1.4")) #ValueError
print(int(1.4)) #1
"""
#9三、列舉3條以上PEP8編碼規範
"""
一、頂級定義之間空兩行,好比函數或者類定義。
二、方法定義、類定義與第一個方法之間,都應該空一行
三、三引號進行註釋
四、使用Pycharm、Eclipse通常使用4個空格來縮進代碼
"""
#9四、正則表達式匹配第一個URL
"""
s = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&rsv_pq=f912242f00000db7&rsv_t=7303ZsYPgxjNvPXiFYC4sw6XnA%2FoEv%2B4FEmxpbfwyXcd9fZ6YFUaAP8XdJc&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=2&rhttps://www.baidu.comsv_sug7=101&rsv_sug2=0&ihttps://www.baidu.comnputT=2342&rsv_sug4=4060&rsv_sug=2"
import re
ret = re.findall(r'https://.*?\.com',s)
print(ret) #['https://www.baidu.com', 'https://www.baidu.com', 'https://www.baidu.com']
"""
#9五、正則匹配中文
"""
import re
title = "你好 ,世界,aaa,我愛北京天安門"
t_obj = re.compile(r'[\u4e00-\u9fa5]+')
ret = re.findall(t_obj,title)
print(ret)
"""
#9六、簡述樂觀鎖和悲觀鎖
"""
悲觀鎖, 就是很悲觀,每次去拿數據的時候都認爲別人會修改,
因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。
傳統的關係型數據庫裏邊就用到了不少這種鎖機制,
好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。
樂觀鎖,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,
因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,
可使用版本號等機制,樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量
"""
#97 r、r+、rb、rb+文件打開模式區別
#9八、Linux命令重定向 > 和 >>
"""
Linux 容許將命令執行結果 重定向到一個 文件
將本應顯示在終端上的內容 輸出/追加 到指定文件中
> 表示輸出,會覆蓋文件原有的內容
>> 表示追加,會將內容追加到已有文件的末尾
將 echo 輸出的信息保存到 1.txt 裏echo Hello Python > 1.txt
將 tree 輸出的信息追加到 1.txt 文件的末尾tree >> 1.txt
"""
#9九、正則表達式匹配出<html><h1>www.itcast.cn</h1></html>
#前面的<>和後面的<>是對應的,能夠用此方法
"""
labels = [
"<html><h1>www.itcast.cn</h1></html>",
"<html><h1>www.itcast.cn</h2></html>"
]
import re
for label in labels:
ret = re.match(r'<(\w*)><(\w*)>.*?</\2></\1>',label)
if ret:
print(ret.group())
else:
print('錯誤的是',label)
<html><h1>www.itcast.cn</h1></html>
錯誤的是 <html><h1>www.itcast.cn</h2></html>
"""
#100、python傳參數是傳值仍是傳址?
"""
Python中函數參數是引用傳遞(注意不是值傳遞)。
對於不可變類型(數值型、字符串、元組),因變量不能修改,
因此運算不會影響到變量自身;而對於可變類型(列表字典)來講,
函數體運算可能會更改傳入的參數變量。
"""
import time
# 10一、求兩個列表的交集、差集、並集
'''
a = [1,2,3,4]
b = [4,3,5,6]
x = set(a) & set(b)
print('這是交集',list(x))
y = set(a) | set(b)
print('這是並集',list(y))
z = set(a) - set(b)
print('這是差集',list(z))
'''
#10二、生成0-100的隨機數
'''
import random
#0-1之間隨機小鼠
ret = random.random() * 100
print(ret)
#0-101之間隨機整數
ret2 = random.randint(0,101)
print(ret2)
'''
#10三、lambda匿名函數好處
'''
精簡代碼,lambda省去了定義函數,map省去了寫for循環過程
list1 = [2,4]
ret = map(lambda x:x**2,list1)
print(ret) #<map object at 0x000001A4FD741208>
print(list(ret)) #[4, 16]
'''
#10四、常見的網絡傳輸協議
'''
http,https,ftp,tcp,udp
'''
#10五、單引號、雙引號、三引號用法
"""
1 表示字符串的時候,單引號裏面能夠用雙引號,而不用轉義字符,反之亦然。
2 可是若是直接用單引號擴住單引號,則須要轉義,像這樣:
' She said:'Yes.' '
3 三引號能夠直接書寫多行,一般用於大段,大篇幅的字符串
"""
#10六、python垃圾回收機制
"""
python垃圾回收主要以引用計數爲主,
標記-清除和分代清除爲輔的機制,
其中標記-清除和分代回收主要是爲了處理循環引用的難題。
引用計數算法
當有1個變量保存了對象的引用時,此對象的引用計數就會加1
當使用del刪除變量指向的對象時,
若是對象的引用計數不爲1,好比3,
那麼此時只會讓這個引用計數減1,即變爲2,
當再次調用del時,變爲1,若是再調用1次del,此時會真的把對象進行刪除
"""
#10七、HTTP請求中get和post區別
"""
一、GET請求是經過URL直接請求數據,數據信息能夠在URL中直接看到,
好比瀏覽器訪問;而POST請求是放在請求頭中的,咱們是沒法直接看到的;
二、GET提交有數據大小的限制,通常是不超過1024個字節,
而這種說法也不徹底準確,HTTP協議並無設定URL字節長度的上限,
而是瀏覽器作了些處理,因此長度依據瀏覽器的不一樣有所不一樣;
POST請求在HTTP協議中也沒有作說明,
通常來講是沒有設置限制的,可是實際上瀏覽器也有默認值。
整體來講,少許的數據使用GET,大量的數據使用POST。
三、GET請求由於數據參數是暴露在URL中的,
因此安全性比較低,好比密碼是不能暴露的,就不能使用GET請求;
POST請求中,請求參數信息是放在請求頭的,因此安全性較高,可使用。
在實際中,涉及到登陸操做的時候,儘可能使用HTTPS請求,安全性更好。
"""
#10八、python中讀取Excel文件的方法
"""
應用數據分析庫pandas
"""
#10九、簡述多線程、多進程
"""
進程:
一、操做系統進行資源分配和調度的基本單位,多個進程之間相互獨立
二、穩定性好,若是一個進程崩潰,不影響其餘進程,
可是進程消耗資源大,開啓的進程數量有限制
線程:
一、CPU進行資源分配和調度的基本單位,
線程是進程的一部分,是比進程更小的能獨立運行的基本單位,
一個進程下的多個線程能夠共享該進程的全部資源
二、若是IO操做密集,則能夠多線程運行效率高,缺點是若是一個線程崩潰,
都會形成進程的崩潰
應用:
IO密集的用多線程,在用戶輸入,sleep 時候,能夠切換到其餘線程執行,
減小等待的時間
CPU密集的用多進程,由於假如IO操做少,用多線程的話,由於線程共享一個全局解釋器鎖,
當前運行的線程會霸佔GIL,其餘線程沒有GIL,就不能充分利用多核CPU的優點
"""
#1十、python正則中search和match
"""
search 匹配的第一個匹配到的數據,加group()
findall 知足正則的都匹配
match 從開頭進行匹配,匹配不到會報錯,加group()
"""