lovecn / lovecn.github.io

个人记录
5 stars 5 forks source link

Pythonic就是以Python的方式写出简洁优美的代码 #47

Open lovecn opened 7 years ago

lovecn commented 7 years ago
#https://www.zhihu.com/question/20244565
1. 交换两个数字

在其他语言里面
t = a
a = b
b = t
在Python语言里面
a, b = b, a

2. 列表推导

列表推导是C、C++、Java里面没有的语法,但是,是Python里面使用非常广泛,是特别推荐的用法。

与列表推导对应的,还有集合推导和字典推导。我们来演示一下。
列表:30~40 所有偶数的平方
[ i*i for i in range(30, 41) if i% 2 == 0 ]
集合:1~20所有奇数的平方的集合
{ i*i for i in range(1, 21) if i % 2 != 0 }
字典:30~40 所有奇数的平方
{ i:i*i for i in range(30, 40) if i% 2 != 0 }

再举两个实用的例子:
当前用户home目录下所有的文件列表
[ item for item in os.listdir(os.path.expanduser('~')) if os.path.isfile(item) ]
当前用户home目录下所有的目录列表
[ item for item in os.listdir(os.path.expanduser('~')) if os.path.isdir(item) ]
当前用户home目录下所有目录的目录名到绝对路径之间的字典
{ item: os.path.realpath(item) for item in os.listdir(os.path.expanduser('~')) if os.path.isdir(item) }

3. 上线文管理器

我们要打开文件进行处理,在处理文件过程中可能会出错,但是,我们需要在处理文件出错的情况下,也顺利关闭文件。

Java风格/C++风格的Python代码:
myfile= open(r'C:\misc\data.txt')
try:
    for line in myfile:
        ...use line here...
finally:
    myfile.close()

Pythonic的代码:
with open(r'C:\misc\data.txt') as myfile:
    for line in myfile:
        ...use line here...
这里要说的是,上下文管理器是Python里面比较推荐的方式,如果用try...finally而不用with,就会被认为不够Pythonic。此外,上线文管理器还可以应用于锁和其他很多类似必须需要关闭的地方。

4. 装饰器

装饰器并不是Python特有的,只是,在Python里面应用非常广泛,我们来看一个例子。

考虑这样一组函数,它们在被调用时需要对某些参数进行检查,在本例中,需要对用户名进行检查,以判断用户是否有相应的权限进行某些操作。
class Store(object):
    def get_food(self, username, food):
        if username != 'admin':
            raise Exception("This user is not allowed to get food")
        return self.storage.get(food)

    def put_food(self, username, food):
        if username != 'admin':
            raise Exception("This user is not allowed to put food")
        self.storage.put(food)
显然,代码有重复,作为一个有追求的工程师,我们严格遵守DRY(Don’t repeat yourself)原则,于是,代码被改写成了这样:
def check_is_admin(username):
    if username != 'admin':
        raise Exception("This user is not allowed to get food")

class Store(object):
    def get_food(self, username, food):
        check_is_admin(username)
        return self.storage.get(food)

    def put_food(self, username, food):
        check_is_admin(username)
        return self.storage.put(food)
现在代码整洁一点了,但是,有装饰器能够做的更好:
def check_is_admin(f):
    def wrapper(*args, **kwargs):
        if kwargs.get('username') != 'admin':
            raise Exception("This user is not allowed to get food")
        return f(*arg, **kargs)
    return wrapper

class Storage(object):
    @check_is_admin
    def get_food(self, username, food):
        return self.storage.get(food)

    @check_is_admin
    def put_food(self, username, food):
        return storage.put(food)
在这里,我们使用装饰器,就可以把参数检查和业务逻辑完全分离开来,让代码显得更加清晰。这也是比较Pythonic的代码。

5. 动态类型语言

我们再来看一个例子,该例子充分演示了动态类型语言与静态类型语言编程之间的差异。

在这个例子中,我们会收到很多不同的请求,对于不同的请求,调用不同的请求处理函数,这个需求如此常见,相信大家应该见过这样的代码:
if (cmd == 'a')
    processA()
else if (cmd == 'b')
    processB()
else if (cmd == ‘c')
    processC()
else if (cmd == 'd')
    processD()
……
else
    raise NotImplementException
在Python里面,我们可以先判断一个类,有没有这个函数,如果有,则获取这个函数,然后再调用。所以,我们的代码可以写成这样:
class A:
    def fetch_func(self, action_name):
        func= getattr(self, action_name, None)
        return func

    def execute(self, action, msg):
        func= self.fetch_func(action)
        if func is None:
            return False, "Action not found"
        return func(action, msg)

结论:所谓的Pythonic,其实并没有大家想的那么神秘,最终目的都是写出简洁优美的代码。写出简洁优美代码的思想在各个语言中都是一样的。如果你用其他编程语言写不出简洁优美的代码,那么,你也没办法用Python写出简介优美的代码。如果你能用其他语言写出很好的代码,那么,还是需要了解Python这门语言特有的一些语法和语言特性,充分利用Python里面比较好语言特性。这样,就能够写出Pythonic的代码了。
代理ip
import urllib.request
import socket
import random

User_Agent = ['Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0',
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)'
        ]
shareUrl = 'http://ip.chinaz.com/getip.aspx'
proxy = {'http':'106.120.78.129:80'}
try:
    #proxy_support=urllib.request.ProxyHandler({'http':proxy})
    proxy_support=urllib.request.ProxyHandler(proxy)
    opener = urllib.request.build_opener(proxy_support)
    random_userAget = random.choice(User_Agent)
    req = urllib.request.Request(shareUrl)
    req.add_header("User-Agent", random_userAget) 
    res = urllib.request.urlopen(req).read().decode("utf8") 
    print (res)
except Exception as e:
    print (e)

#https://www.v2ex.com/t/322997
curl http://ip.chinaz.com/getip.aspx -x 'http://120.52.72.56:80' 
{ip:'120.52.72.56',address:'北京市 联通云 BGP 数据中心'} 
python里一切都是对象,实例是对象,类是对象,元类也是对象,左边元类,中间类,右边实例,实例是对象,因为创建实例的是类.类是对象,创建类的就是元类.可以通过type()函数来查看它的元类.(type(type)得到的是它自己)
![image](https://cloud.githubusercontent.com/assets/6429263/20645056/39f1b7aa-b48a-11e6-919a-339b472fabd4.png)

Python程序打包成EXE http://ldehai.com/blog/2013/09/22/pyinstaller-matplotlib-scipy/ 
 c:\c:/python27/python.exe c:/pyinstaller/pyinstaller.py --noconfirm --noconsole --onefile --icon=Icon.ico myapp.py

python如何优雅的解析jsonp
import json, re
JSONP = 'callbackFunction(["customername1","customername2"])'
j = json.loads(re.findall(r'^\w+\((.*)\)$',JSONP)[0])
print(type(j),j)

<class 'list'> ['customername1', 'customername2']
JSONP = 'callbackFunction(["customername1","customername2"])'
def callbackFunction(lists):
    print lists
eval(JSONP)

['customername1', 'customername2']

info = [
    {'cishu': 372, 'title': '镇中心小学厕所问题'},
    {'cishu': 388, 'title': '私搭乱建'},
    {'cishu': 222, 'title': '新生儿落户收费么?'},
    {'cishu': 341, 'title': '44路车不按时间发车越来越严重'}
]
https://github.com/dokelung/Python-QA
for item in sorted(info, key=lambda dic: dic['cishu'], reverse=True):
    print(item)
{'cishu': 388, 'title': '私搭乱建'}
{'cishu': 372, 'title': '镇中心小学厕所问题'}
{'cishu': 341, 'title': '44路车不按时间发车越来越严重'}
{'cishu': 222, 'title': '新生儿落户收费么?'}
python xlsxwriter画图表 https://segmentfault.com/q/1010000007477623

def paint_unclosed_chart():
    workbook = xlsxwriter.Workbook('test.xlsx')
    worksheet = workbook.add_worksheet()
    workbook = record_report(workbook)
    unclosed_chart = workbook.add_chart({'type': 'scatter', 'subtype': 'straight_with_markers'})
    unclosed_chart.add_series({'values': '=数据处理!$A$2,数据处理!$B$1:$J$1,数据处理!$B$2:$J$2,1'})
    unclosed_chart.add_series({'values': '=数据处理!$A$3,数据处理!$B$1:$J$1,数据处理!$B$3:BJ$3,2'})
    worksheet.insert_chart('A1',unclosed_chart)
    workbook.close()

def record_report(workbook):#, date, unresolved_num, validate_num):
    worksheet = workbook.add_worksheet('数据处理')
    temp_data = [
            ['','10/20','10/21','10/24','10/25','10/26','10/27', '10/28', '10/31', '11/2'],
            ['待解决', '10', '11', '12', '13', '11', '10', '11', '9', '8'],
            ['待验证', '1', '4' , '2', '4', '6', '4', '4', '6', '8']
            ]
    worksheet.write_row('A1', temp_data[0])
    worksheet.write_row('A2', temp_data[1])
    worksheet.write_row('A3', temp_data[2])
    return workbook

if __name__ == '__main__':
    paint_unclosed_chart()

登陆126邮箱https://segmentfault.com/q/1010000007482499 

from selenium import webdriver
import time
driver = webdriver.Chrome("/Users/lvxiang/Downloads/chromedriver")
driver.get('http://www.126.com/')
frame = driver.find_element_by_id('x-URS-iframe')
driver.switch_to.frame(frame)
# XXXX替换为你的用名和密码
driver.find_element_by_css_selector("form input[name='email']").send_keys("XXXX")
time.sleep(1)

driver.find_element_by_css_selector("form input[name='password']").send_keys("XXXX")
time.sleep(1)
driver.find_element_by_id("dologin").click()
print("登录成功")
time.sleep(1)
driver.close()

登陆页面时 会弹出警告框https://segmentfault.com/q/1010000007464718
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')

'''鼠标悬停至 ‘设置’ 链接'''
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()

'''打开搜索设置'''
driver.find_element_by_link_text('搜索设置').click()

'''点击保存设置'''
sleep(2)
driver.find_element_by_class_name('prefpanelgo').click()
sleep(1)

'''接受警告框'''
driver.switch_to.alert.accept()

# -*- coding: UTF-8 -*
users = [
    {
        u'UserName': u'@27ed44102dd86ec42eb1a572b283b5b8',
        u'RemarkPYQuanPin': u'',
        u'DisplayName': u'',
        u'KeyWord': u'',
        u'PYInitial': u'',
        u'Uin': 112266535,
        u'RemarkPYInitial': u'',
        u'PYQuanPin': u'',
        u'MemberStatus': 0,
        u'NickName': u'一二三',
        u'AttrStatus': 2181050407L
    },
    {
        u'UserName': u'@7a9e7af3a886a6c7d7219f0e017e5b586263de82e32300c267a78202118e7573',
        u'RemarkPYQuanPin': u'',
        u'DisplayName': u'',
        u'KeyWord': u'',
        u'PYInitial': u'',
        u'Uin': 22720082935L,
        u'RemarkPYInitial': u'',
        u'PYQuanPin': u'',
        u'MemberStatus': 0,
        u'NickName': u'天天',
        u'AttrStatus': 102469
    },
    {
        u'UserName': u'@886fe820eacd4899505b86469257f56be7f95e8a433109f85e23e12c27a575f6',
        u'RemarkPYQuanPin': u'',
        u'DisplayName': u'',
        u'KeyWord': u'',
        u'PYInitial': u'',
        u'Uin': 33135252892L,
        u'RemarkPYInitial': u'',
        u'PYQuanPin': u'',
        u'MemberStatus': 0,
        u'NickName': u'李金芬',
        u'AttrStatus': 4165
    },
    {
        u'UserName': u'@c5c563df9c089b12eeca1e68dd6745ebf8963092791efd3a17b0867ade949944',
        u'RemarkPYQuanPin': u'',
        u'DisplayName': u'',
        u'KeyWord': u'',
        u'PYInitial': u'',
        u'Uin': 402283062,
        u'RemarkPYInitial': u'',
        u'PYQuanPin': u'',
        u'MemberStatus': 0,
        u'NickName': u'小蜻蜓',
        u'AttrStatus': 4133
    }
]

print filter(lambda x:x[u'NickName'] == u'小蜻蜓', users)
#方法一:
a=[2,3,4,5]
b=[2,5,8]
tmp = [val for val in a if val in b]
print tmp
#[2, 5]

#方法二
print list(set(a).intersection(set(b)))
>>>hexstr='5555555595555A65556AA696AA6666666955'
>>>bin(int(hexstr,16))
>>> import uuid
>>> ud = uuid.uuid1()
>>> ud.hex
'093d15b0a52511e6b3de00e04c08a149'
>>> ud
UUID('093d15b0-a525-11e6-b3de-00e04c08a149')
>>> ud.hex[12:16]
'11e6'
>>> ud.time_hi_version
4582
>>> hex(ud.time_hi_version)
'0x11e6'
如何让selenium关闭最后一个标签且不退出浏览器https://segmentfault.com/q/1010000007392154
Firefox打开tab和关闭tab的快捷键分别为:

Ctrl+t
Ctrl+w
下面有一段实例代码演示如何使用ActionChain来使用操作快捷键:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

# launch our web driver and get a page
browser = webdriver.Firefox()
browser.get("http://www.google.com/")

# try to open a new tab
ActionChains(browser).key_down(Keys.CONTROL).send_keys("t").key_up(Keys.CONTROL).perform()
# 你可以自行添加关闭tab页面的快捷键达到你的目的
windows下python3,print列表字符编码问题.UnicodeEncodeError: 'gbk' codec can't encode character '
\U0001f338' in position 2610: illegal multibyte sequence 
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

Python 3中基本的str就是unicode,所以可以直接判断str:

>>> isinstance('s', str)
True
用Python中的dbm存储博客的配置

import dbm

db = dbm.open('websites', 'c')
# Iterate over the keys
for key in db.keys():
    print(key, db[key])
一个 word 文件,里面有 200 个单词(一个单词一行),如果想随机分 18 组,每组 50 个,再输出到 word 里

import itertools
lst = ['a', 'b', 'c'] #从word文件中将单词读到lst列表
repeat = 2 #这里就是你想分组的数目
for x in itertools.product(lst, repeat=2):
    print x
Python如何给sorted里的key动态的传参数
def sort(a, args):
    return sorted(a, key=lambda x: tuple(x[i] for i in args), reverse=True)

dic_sorted = sort(lst, ['time', 'id', 'type'])
python正则表达式可以在查找的同时处理替换def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
base64在python2和python3都运行通过https://segmentfault.com/q/1010000007428472
import base64, json, hashlib

args = [1,2,3,4]
text = json.dumps(args)
try:
    text = bytes(text, 'utf-8')
except:
    pass
query = base64.b64encode(text)
auth = hashlib.md5(query).hexdigest()
print(auth)
如何匹配字符串中的\\并替换成\https://segmentfault.com/q/1010000007432734
>>> a='\\u4e2d\uff0c\\u4f7f\\u7528traceback\\u5904\\u7406\\u5f02\\u5e38\\u4fe1\\u606f'
>>> import json
>>> json.loads('"%s"'%a)
'中,使用traceback处理异常信息'
>>> eval('"%s"'%a)
'中,使用traceback处理异常信息

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

# Record the search window
search_windows = driver.current_window_handle

# Deal with Baidu search
elem = driver.find_element_by_id("kw")
elem.clear()
elem.send_keys("pycon")
elem.send_keys("python selenium programmer")
search = driver.find_element_by_id("su")
search.click()

# Open a registration page
login = driver.find_element_by_name('tj_login')
login.click()
driver.find_element_by_link_text(u'立即注册').click()

# Get all window handles
all_handles = driver.window_handles

# If handle is not search, input some thing in registration page
for handle in all_handles:
    if handle != search_windows:
       driver.switch_to.window(handle)
       print('now register window!')
       driver.find_element_by_name("userName").send_keys('username')
       driver.find_element_by_name('phone').send_keys('password')
       time.sleep(2)

# If handle is search, switch to the search windows and do some search again
for handle in all_handles:
    if handle == search_windows:
       driver.switch_to.window(search_windows)
       print('now sreach window!')
       driver.find_element_by_id('TANGRAM__PSP_2__closeBtn').click()
       driver.find_element_by_id("kw").send_keys("selenium")
       driver.find_element_by_id("su").click()
       time.sleep(2)

driver.close()
https://segmentfault.com/a/1190000007249396 
python selenium2 frame间的跳转 嵌套frame/iframe需要一层一层跳转,且只能从defaultcontent跳最高frame,父亲frame跳向儿子frame。平级不能跳

所以你第二次要返回先SI2_mem_index的,才能再跳(header和body的两个iframe平级)https://segmentfault.com/q/1010000007444946
https://segmentfault.com/q/1010000007622262 
>>> str1 = '\xB4\xF3\xE5N'
>>> str1
'´óåN'
>>> bytes(str1,'l1').decode('gbk')
'大錘'
>>> unicode = _
>>> unicode
'大錘'
>>> utf8=unicode.encode('utf8')
>>> utf8
b'\xe5\xa4\xa7\xe9\x8c\x98'
python的sort函数使用的时候有一个参数cmp。一定注意这里返回值要用1和-1。不能True和False!!!

Python中调用json模块输出json字符串时,如何解决中文输出的问题json.dumps(data, ensure_ascii=False, indent=2) 
lovecn commented 7 years ago
function &chhua() 
{ 
static $b="www.jb51.net";//申明一个静态变量 
$b=$b."WEB开发"; 
echo $b; 
return $b; 
} 

$a=chhua();//这条语句会输出 $b的值 为“www.jb51.netWEB开发” 
$a="PHP"; 
echo "<Br>";
$a=chhua();//这条语 句会输出 $b的值 为“www.jb51.netWEB开发WEB开发”  
echo "<Br>";
$a=&chhua();//这条语句会输出 $b的值 为“www.jb51.netWEB开发WEB开发WEB开发” 
echo "<Br>";
$a="JS"; 
$a=chhua(); //这条语句会输出 $b的值 为"JSWEB开发"

function &test()
{
    static $b=0;//申明一个静态变量
    $b=$b+1;
    echo $b;
    return $b;
}
  //http://www.jb51.net/article/51985.htm
$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这 条语句会输出 $b的值 为2
$a=&test();//这条语句会输出 $b的值 为3
$a=5;
$a=test(); //这条语句会输出 $b的值 为6
lovecn commented 7 years ago

nginx配置类似于这样:

fastcgi_param HTTP_X_FORWARD_FOR $remote_addr;

上一句的目的是,将HTTP_X_FORWARD_FOR的值设置为$remote_addr的值。也就是将用户真实的ip(或用户使用代理的ip)放到HTTP_X_FORWARD_FOR中去。

$remote_addr是nginx的内置变量,这个变量它得到是用户真实的ip地址(用户使用了代理,则就是代理的ip地址)。

于是在php端通过getenv("HTTP_X_FORWARDED_FOR")就可以获取到nginx传递过来的值,是用户真实的ip地址。

lovecn commented 7 years ago
//大体思路:由于是二维数组。所以先得到指定key的所有值。也就是转换为一维数组了。

/*
不过这个一维数组的key要使用二维数组的key。这样子一维数组排序后,方便对应到二维数组中去。就是靠这个key。

一维数组如下:
array('1'=>'a','4'=>''b','3'=>'c','5'=>'d');

1,2,4这些key值,到时候就是对应到里面去的证据

思考,如果还要加一个条件呢比如像sql那样子的:order by a,b,c
当a字段的值都相等的情况下,就启用b字段进行排序。如果还是相等,则启用c字段进行排序。

*/

/*
$keys = array();

$keys['gg'] = '8.9';
$keys[1] = '8.8';

$keys[5] = '7.5';

asort($keys);//排序有个特点,原来的key值不会改变的。只是把位置换一下。我之前以为是调换了key值。这样子,0,1,2,3,4

reset($keys);
var_dump($keys);

*/

/*
 * +-------------------------------------------------------
 * 快速排序
 * @author wangtao 2015.6.10
 * +-------------------------------------------------------
 * @param $arr 要排序的数组,二维数组。对应就是数据库中的多行数据
  array(
 * 0=>array("字段1"=>'','字段2'=>''...)
 * 1=>array("字段1"=>'','字段2'=>''...)
 * 2=>array("字段1"=>'','字段2'=>''...)
 * )
 * @param $key_field 按照哪个字段进行排序
 * @param $sort_type = asc or desc  排序方式。从小大到大,还是从大到小
 * +-------------------------------------------------------
 * return 按照指定排序后的一个新数组。原来的key仍然会保留
 * 如:1=>array("字段1"=>'','字段2'=>''...),2=>array("字段1"=>'','字段2'=>''...)  
 * 按照"字段2"排序后,key为2元素可能在前面前面了,但是key值不会被修改,会原样保留
 * +-------------------------------------------------------
 */

function quick_sort($arr, $key_field, $sort_type = "asc") {
    if (count($arr) > 1) {
        //使用哪个字段排序,先得到该字段所有数据,目的是转换成一维数组进行排序
        $key_value_arr = array();
        $return_arr = array();
        //先判断排序的字段是否存在,如果字段根本不存在,避免打乱原来数组的顺序

        foreach ($arr as $k => $v) {
            @ $key_value_arr[$k] = $v[$key_field]; //得到这个字段的值

        }

        //php内置函数实现了按降序还是升序排,但是只支持一维数组
        if ($sort_type == 'desc') {
            arsort($key_value_arr);
        } else {
            asort($key_value_arr);
        }

        reset($key_value_arr);

        foreach ($key_value_arr as $k => $v) {
            $return_arr[$k] = $arr[$k]; //得到行
        }
        //var_dump($return_arr);
        return $return_arr;
    } else {
        return $arr;
    }
}

$array = array(
array('name'=>'手机','brand'=>'诺基亚','price'=>1050),
array('name'=>'笔记本电脑','brand'=>'lenovo','price'=>4300),
array('name'=>'剃须刀','brand'=>'飞利浦','price'=>3100),
array('name'=>'跑步机','brand'=>'三和松石','price'=>4900),
array('name'=>'手表','brand'=>'卡西欧','price'=>960),
array('name'=>'液晶电视','brand'=>'索尼','price'=>6299),
array('name'=>'激光打印机','brand'=>'惠普','price'=>1200),
array('name'=>'手机','brand'=>'诺基亚','price'=>1050),
);

var_dump(quickSort($array,'m'));

//看对一个数组里面元素值都为空的怎么排序
$row = array(
0=>null,
1=>null,
2=>null,
3=>null,
);
asort($row);
var_dump($row);//如果为空。则根据key值倒过来?
//http://www.cnblogs.com/wangtao_20/p/3505362.html
/*返回的是array
  3 => null
  2 => null
  1 => null
 0 => null
现在终于明白了,数据库字段中是否保持null,对于排序是有影响的。结果就会影响展示效果。
*/
lovecn commented 7 years ago

Python正则表达式中findall返回列表中包含空字符串js

'ABCD'.match(/.$/g) ["ABCD", ""] 'ABCD'.match(/^./g) ["ABCD"] python3

re.findall(r'.\b', 'ABCD') ['ABCD', ''] re.findall(r'.(?=$)', 'ABCD') ['ABCD', ''] re.findall(r'.{0,}(?=$)', 'ABCD') ['ABCD', ''] \b、^、$、(?=exp) 这几个是零宽断言,只匹配位置,不消耗字符。

位置之后的零个字符''正好符合.*