1、map()
此函数可以,将列表每一个函数作用在函数上,并返回list
常用语法点
每一种编程语言在用的过程中都会发现有时候要一种特定需求的功能函数,结果没有内置这样的函数,这个时候就需要自己根据已有函数编写尽可能简单的函数,下面是我在做php相关工作时积累下的函数,会持续更新,您要是有好的也可以推荐给我,我在这里统一展示给大家。
/*
*
* 生成验证字符串
*/
private function createNonceStr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/*
*
* 拼接签名字符串
* @param array $urlObj
*
* @return 返回已经拼接好的字符串
*/
private function ToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign"){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
/*
* 获取中文字首字母信息
*/
function getfirstchar($s0)
{
$firstchar_ord = ord(strtoupper($s0{0}));
if (($firstchar_ord>=65 and $firstchar_ord<=91)or($firstchar_ord>=48 and $firstchar_ord<=57)) return strtoupper($s0{0});
$s=iconv("UTF-8","gb2312", $s0);
$asc=ord($s{0})*256+ord($s{1})-65536;
if($asc>=-20319 and $asc<=-20284)return "A";
if($asc>=-20283 and $asc<=-19776)return "B";
if($asc>=-19775 and $asc<=-19219)return "C";
if($asc>=-19218 and $asc<=-18711)return "D";
if($asc>=-18710 and $asc<=-18527)return "E";
if($asc>=-18526 and $asc<=-18240)return "F";
if($asc>=-18239 and $asc<=-17923)return "G";
if($asc>=-17922 and $asc<=-17418)return "H";
if($asc>=-17417 and $asc<=-16475)return "J";
if($asc>=-16474 and $asc<=-16213)return "K";
if($asc>=-16212 and $asc<=-15641)return "L";
if($asc>=-15640 and $asc<=-15166)return "M";
if($asc>=-15165 and $asc<=-14923)return "N";
if($asc>=-14922 and $asc<=-14915)return "O";
if($asc>=-14914 and $asc<=-14631)return "P";
if($asc>=-14630 and $asc<=-14150)return "Q";
if($asc>=-14149 and $asc<=-14091)return "R";
if($asc>=-14090 and $asc<=-13319)return "S";
if($asc>=-13318 and $asc<=-12839)return "T";
if($asc>=-12838 and $asc<=-12557)return "W";
if($asc>=-12556 and $asc<=-11848)return "X";
if($asc>=-11847 and $asc<=-11056)return "Y";
if($asc>=-11055 and $asc<=-10247)return "Z";
return null;
}
/**
* 获取客户端IP地址
* @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
* @return mixed
*/
function get_client_ip($type = 0) {
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
/**
* 字符串加密、解密函数
*
*
* @param string $txt 字符串
* @param string $operation ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
* @param string $key 密钥:数字、字母、下划线
* @param string $expiry 过期时间
* @return string
*/
function encry_code($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key != '' ? $key : config('encry_key'));
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya . md5($keya . $keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(strtr(substr($string, $ckey_length), '-_', '+/')) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for ($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for ($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == 'DECODE') {
if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc . rtrim(strtr(base64_encode($result), '+/', '-_'), '=');
}
}
/*
* 函数说明:截取指定长度的字符串
* utf-8专用 汉字和大写字母长度算1,其它字符长度算0.5
*
* @param string $str 原字符串
* @param int $len 截取长度
* @param string $etc 省略字符...
* @return string 截取后的字符串
*/
function ReStrLen($str, $len=10, $etc='...')
{
$restr = '';
$i = 0;
$n = 0.0;
//字符串的字节数
$strlen = strlen($str);
while(($n < $len) and ($i < $strlen))
{
$temp_str = substr($str, $i, 1);
//得到字符串中第$i位字符的ASCII码
$ascnum = ord($temp_str);
//如果ASCII位高与252
if($ascnum >= 252)
{
//根据UTF-8编码规范,将6个连续的字符计为单个字符
$restr = $restr.substr($str, $i, 6);
//实际Byte计为6
$i = $i + 6;
//字串长度计1
$n++;
}
else if($ascnum >= 248)
{
$restr = $restr.substr($str, $i, 5);
$i = $i + 5;
$n++;
}
else if($ascnum >= 240)
{
$restr = $restr.substr($str, $i, 4);
$i = $i + 4;
$n++;
}
else if($ascnum >= 224)
{
$restr = $restr.substr($str, $i, 3);
$i = $i + 3 ;
$n++;
}
else if ($ascnum >= 192)
{
$restr = $restr.substr($str, $i, 2);
$i = $i + 2;
$n++;
}
//如果是大写字母 I除外
else if($ascnum>=65 and $ascnum<=90 and $ascnum!=73)
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数仍计1个
$i = $i + 1;
//但考虑整体美观,大写字母计成一个高位字符
$n++;
}
//%,&,@,m,w 字符按1个字符宽
else if(!(array_search($ascnum, array(37, 38, 64, 109 ,119)) === FALSE))
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数仍计1个
$i = $i + 1;
//但考虑整体美观,这些字条计成一个高位字符
$n++;
}
//其他情况下,包括小写字母和半角标点符号
else
{
$restr = $restr.substr($str, $i, 1);
//实际的Byte数计1个
$i = $i + 1;
//其余的小写字母和半角标点等与半个高位字符宽
$n = $n + 0.5;
}
}
//超过长度时在尾处加上省略号
if($i < $strlen)
{
$restr = $restr.$etc;
}
return $restr;
原型 map(function,[list])
def fc(x):
return x * 2
print(map(fc,[1,2,3,4,5]))
1. functools.partial:
作用:创建偏函数
用法:简单使用
int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换
案例:修改系统的int函数,变成只转换二进制数据
# 原型
>>>> import functools
>>>> int2 = functools.partial(int, base=2)
# 等价于
>>>> def int2(x, base=2):
return int(x, base)
- 第一,生成随机字符串
}
输出:
2. 匿名函数lambda:
作用: 用来申明匿名函数
用法,简单使用
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
案例:使用关键字实现匿名函数:
# 原型
>>>> lambda x: x * x
# 等价于
>>>> def f(x) :
return x * x
代码如下面所示,要注意以下,查看手册可以看到,php在版本4.2.0以前生成随机数时,需要先给随机数发生器播种,PHP_VERSION>4.2.0的版本,系统自动完成播种工作,所以这里要做下判断。
/*
* 获得当前的页面文件的url
*/
public function GetCurUrl()
{
if(!empty($_SERVER['REQUEST_URI']))
{
$nowurls = explode('?',$_SERVER['REQUEST_URI']);
$nowurl = $nowurls[0];
}
else
{
$nowurl = $_SERVER['PHP_SELF'];
}
return $nowurl;
}
//查看数据大小
function GetRealSize($size)
{
$kb = 1024; // Kilobyte
$mb = 1024 * $kb; // Megabyte
$gb = 1024 * $mb; // Gigabyte
$tb = 1024 * $gb; // Terabyte
if($size < $kb)
return $size.'B';
else if($size < $mb)
return round($size/$kb,2).'KB';
else if($size < $gb)
return round($size/$mb,2).'MB';
else if($size < $tb)
return round($size/$gb,2).'GB';
else
return round($size/$tb,2).'TB';
}
//获取文件夹大小
function GetDirSize($dir)
{
$handle = opendir($dir);
$fsize = '';
while(($fname = readdir($handle)) !== false)
{
if($fname != '.' && $fname != '..')
{
if(is_dir("$dir/$fname"))
$fsize += GetDirSize("$dir/$fname");
else
$fsize += filesize("$dir/$fname");
}
}
closedir($handle);
if(empty($fsize)) $fsize = 0;
return $fsize;
}
//创建多级目录
function MkDirs($dir)
{
return is_dir($dir) or (MkDirs(dirname($dir)) and mkdir($dir, 0777));
}
//读取文件内容
function Readf($file)
{
if(file_exists($file) && is_readable($file))
{
if(function_exists('file_get_contents'))
{
$str = file_get_contents($file);
}
else
{
$str = '';
$fp = fopen($file, 'r');
while(!feof($fp))
{
$str .= fgets($fp, 1024);
}
fclose($fp);
}
return $str;
}
else
{
return FALSE;
}
}
// 写入文件内容
function Writef($file,$str,$mode='w')
{
if(file_exists($file) && is_writable($file))
{
$fp = fopen($file, $mode);
flock($fp, 3);
fwrite($fp, $str);
fclose($fp);
return TRUE;
}
else if(!file_exists($file))
{
$fp = fopen($file, $mode);
flock($fp, 3);
fwrite($fp, $str);
fclose($fp);
}
else
{
return FALSE;
}
}
// 清除HTML
function ClearHtml($str)
{
$str = strip_tags($str);
//首先去掉头尾空格
$str = trim($str);
//接着去掉两个空格以上的
$str = preg_replace('/\s(?=\s)/', '', $str);
//最后将非空格替换为一个空格
$str = preg_replace('/[\n\r\t]/', ' ', $str);
return $str;
}
// 是否移动设备访问
function IsMobile()
{
//如果有HTTP_X_WAP_PROFILE则一定是移动设备
if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return TRUE;
//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if(isset($_SERVER['HTTP_VIA']))
{
//找不到为flase,否则为true
return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
}
//判断手机发送的客户端标志,兼容性有待提高
if(isset($_SERVER['HTTP_USER_AGENT']))
{
$clientkeywords = array('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile');
//从HTTP_USER_AGENT中查找手机浏览器的关键字
if(preg_match('/('.implode('|', $clientkeywords).')/i', strtolower($_SERVER['HTTP_USER_AGENT'])))
{
return TRUE;
}
}
//协议法,因为有可能不准确,放到最后判断
if(isset($_SERVER['HTTP_ACCEPT']))
{
//如果只支持wml并且不支持html那一定是移动设备
//如果支持wml和html但是wml在html之前则是移动设备
if((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) &&
(strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false ||
(strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
{
return TRUE;
}
}
return FALSE;
}
[2,4,6,8,10]
3. 值得注意的代码(一):
>>>> if __name__=='__main__':
test()
解释:
当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量”__name__”
置为”__main__”,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if
测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
简单用法:
图1:使用案例
<?php
function rand_str($length) {
$string = '';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
if(version_compare(PHP_VERSION, '4.2.0') >= 0) {
for($i=0;$i<$length;$i++) {
$p = rand(0,$max);
$string .= $chars[$p];
}
} else {
mt_srand((double)microtime(true)*1000000);
for($i=0;$i<$length;$i++) {
$p = mt_rand(0,$max);
$string .= $chars[$p];
}
}
return $string;
}
4. 模块搜索路径:
目前:
当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys
模块的path变量中:
命令行查看
>>>> import sys
>>>> sys.path
自定义搜索路径:
方法一:是直接修改sys.path,添加要搜索的目录
>>> import sys
>>> sys.path.append(‘/Users/michael/my_py_scripts’)
注意:这种方法是在运行时修改,运行结束后失效。
方法二:设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
-
第二,检测电话正确与否
/*
@desc 检测电话号码是否正确
@param string $phone 电话号码
@param $type string 要检测的类型 CHN=>中国,INT=>国际
*/
function istelephone($phone, $type = ‘CHN’) {$ret = false; switch($type){ case "CHN": $ret = (preg_match("/^(13[0-9]{9}$)|(14[0-9]{9}$)|(15[0|1|2|3|5|6|7|8|9]\d{8}$)|(18[0|1|2|3|5|6|7|8|9]\d{8})|(1709\d{7})/", trim($phone)) ? true : false); break; case "INT": $ret = (preg_match("/^((\(\d{3}\))|(\d{3}\-))?\d{6,20}$/", trim($phone)) ? true : false); break; } return $ret === false ? false : true;
}
-
第三,curl函数的封装
function curl($url, $method=”get”, $post=array(), $options=array(), &$error=false, &$errno=false, &$httpCode=false) {
$defaults = array( CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 60, ); if($method=="post"){ $defaults[CURLOPT_POST] = 1; $defaults[CURLOPT_POSTFIELDS] = $post; } $ch = curl_init(); $result = ''; if($ch) { foreach($options as $k=>$v) { $defaults[$k] = $v; } curl_setopt_array($ch, $defaults); $result = curl_exec($ch); if($result === false) { if($error !== false) { $error = curl_error($ch); } if($errno !== false) { $errno = curl_errno($ch); } if($httpCode !== false) { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); } } curl_close($ch); } return $result;
}
//get方式获取我的博客的rss页面
print_r(curl(“”));
//post方式获取ip地址信息
print_r(curl(“‘)));
是不是很方便,当然有人说,可以写成for循环,是的这样也可以实现,但是我们有更简便的方法,有必要写这么一个for循环吗。
5. 给类与实例绑定方法
类(Student):
>>>> class Student(object):
gender = ‘male’
实例(Tom & Jack):
>>>> Tom = Student()
>>>> Jack = Student()
方法一:
>>>> def set_score(self, score):
self.score = score
方法二:
>>>> def set_age(self, age):
self.age = age
-
给类绑定方法
>>>> Student.set_score = set_score
Tom.set_score(100)
Tom.score ~> 100Jack.set_score(90) Jack.score ~> 90
-
给实例绑定方法
from types import MethodType
>>>> Tom.set_age = MethodType(set_age, Tom)
Tom.set_age(20)
Tom.age ~> 20Jack.set_age(20) : ~> Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute 'set_age'
list = []
for i in [1,2,3,4,5]:
list.append(i*2)
print(list)
6. __slots__关键字
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
参考代码:
>>>> class Student(object):
slots = (‘name’, ‘age’) # 用tuple定义允许绑定的属性名称
效果:
>>>> s = Student() # 创建新的实例
>>>> s.name = ‘Michael’ # 绑定属性’name’
>>>> s.age = 25 # 绑定属性’age’
>>>> s.score = 99 # 绑定属性’score’
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
AttributeError: ‘Student’ object has no attribute ‘score’
解释:
由于’score’没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。
注意:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
输出:
7. __getattr__方法
当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self,
‘score’)来尝试获得属性,这样,我们就有机会返回score的值。
注意:__getattr__方法不仅可以动态生成属性,还能生成方法
-
__getattr__生成属性
定义:
>>>> class Student(object):
def init(self):
self.name = ‘Michael’
def getattr(self, attr):
if attr==’score’:
return 99
使用:
>>> s = Student()
>>> s.name : ~>’Michael’
>>> s.score : ~> 99 -
__getattr__生成方法
定义:
>>>> class Student(object):
def init(self):
self.name = ‘Michael’
def getattr(self, attr):
if attr==’age’:
return lambda:25
raise AttributedError(”Student’ object has no attribute ‘%s” %
attr)
使用:
>>> s = Student()
>>> s.age() : ~> 25
[2,4,6,8,10]
8. __call__方法
一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。
请看示例:
>>>> class Student(object):
def init(self, name):
self.name = name
def call(self):
print(‘My name is %s.’ % self.name)
调用方式如下:
>>>> s = Student(‘Michael’)
>>>> s() # self参数不要传入My name is Michael.
总结:
- __call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。
- 怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例:
>>>> callable(Student()) # True
>>>> callable([1, 2, 3]) # False - 通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。
9. type()函数
type()函数既可以返回一个对象类型,也可以创建出新的类型。
- 使用type()函数创建一个class对象
至少需要一次传入3个参数:
a> class的名称;
b>
继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
c> class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
代码实现:
>>>> Hello = type(‘Hello’, (object,), dict(hello=fn)) #
创建Hello class
>>>> h = Hello()
>>>> h.hello() # Hello, world.
通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。
当然map()函数还有更多,更复杂的用法
print(map(str,[1,2,3,4,5]))
结果:列表内元素都转换成了字符串
['1', '2', '3', '4', '5']
首字母大写;用到str.title属性
print(map(str.title,['abc','def','ghj']))
输出:
['Abc', 'Def', 'Ghj']
2、eval()此函数,将字符串,转换成其类型对象
为什么说eval()是转换成,其类型对象呢,这是因为,具体是什么类型的数据取决于,字符串内容
如:eval(“1234”)这个会转成int型
eval(“{‘user’:’name’}”)
这样会转成字典等
例子:将字符串,转换成字典
strdic = '''{'username':'pyhleng','password':'q123456'}
'''
print eval(strdic)
print(eval(strdic)['password'])
输出:
{'username': 'pyhleng', 'password': 'q123456'}
q123456
有没有上边的代码是多此一举,直接定义一个字典对象不就行了,为什么要有三引号,引上。是啊为什么要这样做?????
上边代码只是写一个例子,模拟将数据{‘username’:’pyhleng’,’password’:’q123456′}
存储在数据表,然后在读出来的样子。
如果将{‘username’:’pyhleng’,’password’:’q123456′}存在数据表中,在读出来的时候就是字符串。如果要当字典用那么
eval()函数是少不了的。
3、reduce()此函数,函数参数必须有两个,把结果与序列的下一个元素做累计
def add(x,y):
return x + y
print reduce(add,[1,2,3,4,5])
输出:
15
add函数必须有两个参数,然后每次,结果和下一个做累计,稍加改动1*2*3*4*5
def add(x,y):
return x * y
print reduce(add,[1,2,3,4,5])
输出:
120
4、filter()此函数,传入一个函数和序列做为参数
过滤,序列中的每一个元素,符合函数条件True的留下,False的去掉,最后返回一个过虑后的序列
def fcq(x):
return x==4
print filter(fcq,[1,3,4,5,4,6,4])
输出:
[4, 4, 4]
5、lambda()匿名函数,有时不需要显示的定义函数,可以使用此函数
以map()为例:lambda y: y*2 其中y:是参数,y*2是函数体
print(map(lambda y: y*2,[1,2,3,4,5]))
print map(lambda y: y*2,[1,2,3,4,5])
相当于:
def fc(y)
return y * 2
print map(fc,[1,2,3,4,5])
6、sorted()排序(可以对list,dict,字符串等排序)
定义一个比较函数,定义x,y两个参数,进行比较,大于返回-1,小于返回1,等于返回0
然后使用sorted()进行排序。
倒序:
def cmp(x,y):
if x>y:
return -1
if x<y:
return 1
return 0
print(sorted([1,2,3,4,5]),cmp)
输出:
[5, 4, 3, 2, 1]
正序:
print(sorted([1,2,3,4,5]))
输出:
[1, 2, 3, 4, 5]
7、**args和**kwargs参数
这两个是python的可变参数,其中*args是元组;**kwargs是字典类型参数
示例如下:*args和**kwargs可以同时使用。
def foo(*args,**kwargs):
print(args)
print(kwargs)
foo(1,2,3)#元组参数这样使用
foo(a=5,b=6,c=7) #字典传参写x =x这种格式
foo(a=1,b=2,c=3)
foo(4,5,6,e=5,f=6,g=7)
输出:因为函数定义两个类型参数,调用时有的只写了一个类型,所以会有()或{}输出。
(1, 2, 3)
{}
-------------------------------
()
{'a': 5, 'c': 7, 'b': 6}
-------------------------------
()
{'a': 1, 'c': 3, 'b': 2}
-------------------------------
(4, 5, 6)
{'e': 5, 'g': 7, 'f': 6}
8、日期时间函数
获取当前日期时间
import time
curTime = time.strftime('%Y.%m.%d %H:%M:%S',time.localtime()).decode('utf-8')
格式化字符串:
%Y 年
%m 月
%d 日
%H 时
%M 分
% S 秒
9.list.reverse() 列表翻转
list = ['a','b','c']
print list.reverse() #返回None,这个只是实现list的返向排列,返回None
print list #返回['c', 'b', 'a']
10.MAX()
print max([1,2,3,4,5,6]) #返回列表中,最大的元素6
11.ZIP()
print zip('a','b','c','d') #返回元组[('a', 'b', 'c', 'd')]
12.all()
print all(['1','2','3','4']) #所有元素为True时返回True,all([])返回True
13.any()
print any(['1','2','3','4']) #所有元素为True时返回True,all([])返回False
14.list.sort()
list = ['c','b','a']
print list.sort() #返回None
print list #返回['a', 'b', 'c']