Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lovecn opened this issue Nov 26, 2016 · 4 comments
Open

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

lovecn opened this issue Nov 26, 2016 · 4 comments

Comments

@lovecn
Copy link
Owner

lovecn commented Nov 26, 2016

#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
Copy link
Owner Author

lovecn commented Nov 26, 2016

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
Copy link
Owner Author

lovecn commented Nov 26, 2016

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
Copy link
Owner Author

lovecn commented Nov 26, 2016

//大体思路:由于是二维数组。所以先得到指定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
Copy link
Owner Author

lovecn commented Nov 27, 2016

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)
这几个是零宽断言,只匹配位置,不消耗字符。

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant