python中 lambda表达式及map

python中 lambda表达式及map

#lamba 前面 a b表示入参 :后面表示逻辑
# add=lambda a,b:a*8+b
# print(add(4,7))
# print((lambda a,b:a*8+b)(4,7))

# lambda表达式的使用场景
# 一般适用于创建一些临时性的,小巧的函数。比如上面的 power函数,我们当然可以使用 def
# 来定义,但使用 lambda 来创建会显得很简洁,尤其是在高阶函数的使用中。
#定义一个函数,传入一个list,将list每个元素的值加1

# def add (l=[]):
# return [x+1 for x in l]
#
# print(add([1,5,6]))

# def add (a,l=[]):
# return [x+a for x in l]
#
# print(add(3,l=[4,5,6,8]))
#
# def add2(fun,l=[]):
# return [fun(x) for x in l]
#
# print(add2(lambda x:x+1,[4,5,6,8]))
# print(add2(lambda x:x+2,[4,5,6,8]))
#
# 还是觉得多加一个参数更好,在java中也是多一个参数就解决了

#map其实就是map(function(),(参数))

def add(a):
return a+1

result=map(add,[5,8,9,6,7])
#直接打印会出现地址,需要用list()函数转成表
print(list(result))
print(type(result))
#结果为[6, 9, 10, 7, 8] <class ‘map’>

#使用lambda

result1=map(lambda a:a+1,[1,4,5,7,9])
print(list(result1))
#结果[2, 5, 6, 8, 10]

#map中函数有多个参数

result2=map(lambda a,b:a+b,[1,5,9,7],[5,6,99,7])
print(list(result2))
#结果[6, 11, 18, 14]

#当参数个数不同以少的为准
result3=map(lambda a,b:a+b,[1,5,9,7],[5,6,7])
print(list(result3))
#结果[6, 11, 16]

在Android Studio重新上传项目时,遇到报错问题

描述:

在GitHub上面上传项目,但是感觉有些问题,就想删除了重新上传。

但是在Android Studio重新上传项目时,遇到了问题,一直提示“project is already on github”

 

解决方案:

1、关闭Android Studio项目;

 

2、进入到本地项目目录,找到隐藏文件夹.git

%title插图%num

 

进入该文件夹下,找到config文件

删除下面这段内容

[remote "origin"]
    url = https://github.com/AnneHan/slidingMenu.git
    fetch = +refs/heads/*:refs/remotes/origin/*

%title插图%num

 

保存config文件

 

3、重新打开Android Studio,进入VCS->Import into Version Control->Share Project on GitHub,再次上传项目即可。

新手向:python 判断奇偶数的二进制方法

新手向:python 判断奇偶数的二进制方法

新手向:python 判断奇偶数的二进制方法
常规方法:
一般情况下,需要判断一个数是否是偶数,常规思路是一直除2,直到余数为0,如果余数为1,则这个数为奇数

num = int(input(‘please input a number: ‘))
if num%2==0:
print(f'{num} is even’)
else:
print(f'{num} is odd’)

测试:

please input a number: 98
98 is even

——————————————-
please input a number: -101
-101 is odd

二进制方法:
直接上代码

num=int(input(‘please input a number: ‘))
if num & 1 == 0 :
print(f'{num} is even’)
else:
print(f'{num} is odd’)

测试:

please input a number: 101
101 is odd
————————————
please input a number: 996
996 is even

这里if的判断条件改成了

num & 1 == 0

这里的符号

&

是按位与运算符

与运算符的机制为

0 & 0 = 0; 0 & 1 = 0;
1 & 1 = 1; 1 & 0 = 0;

总结一下,只有1和1与运算的情况下,计算后的值才为1,其余都是0

而如果是这种情况的话,大家有没有想通呢,在这个机制下,由于偶数转为二进制后*后一位肯定为1(不信你就找一个偶数一直除2试一试,看看*后一位是不是一定为0 (●’◡’●)),和1与运算后取0,可能到这里大家还没有什么感觉,但是继续细想的话,如果是奇数,二进制后*后一位肯定为1,和1与运算后还为1,这样就可以判断奇偶性了

对了,这里还忽略了一点,偶数*后一位一定取0是没错,那前面的数字怎么办,不管了吗???一个二进制数不可能只有*后一位吧

好,非常好,就喜欢这样的同学,但是同学你再仔细想一想,我们是和0001进行与运算,而这个数字除了*后一位是1,前面全是0,即无论你这个数前面多么长,多么无规律,多么复杂,我都不在乎,因为我前面都是0,与运算后一定也为0,这样就不用在乎前面的位啦

举个例子:
比如说,十进制里的20转换二进制为0001 0100,1转换为二进制后是0000 0001

20 = 0001 0100
& 1 = 0000 0001
—————— # 偶数
0000 0000

35 = 0010 0011
& 1 = 0000 0001
—————— # 奇数
0000 0001

多提一嘴,python里你用“&”符号后,前后两个数自动就是二进制了,不用再使用bin()函数转化,不过电脑里本来装的就是二进制数字,这样可以说是回归初心?

额外:
判断一个数是否为2的幂

num & (num-1) == 0
或者
(num & -num) == num

总结
判断奇偶

num & 1 == 0

大家明白了嘛,虽然这个小技巧看起来可能没什么用,但其实还是有点用的,因为这样电脑的运算速度更快,但同时代码可读性也会降低,尽管这样很帅(bushi

总而言之,因为2的倍数的二进制*后一位都是0,所以n&1表达式跟n%2结果是一样的

谢谢大家阅读,这是我的*篇文章,风格没那么严肃,希望大家喜欢

python爬虫,嗅事百科(段子爬取)

python爬虫,嗅事百科(段子爬取)

coding=utf-8
“””
author:lei
function:
“””

import requests
from lxml import etree
import json

class QiuShi(object):

def __init__(self):
self.url = “https://www.qiushibaike.com/text/”
self.headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36”, “Referer”: “https://www.qiushibaike.com/”}

def get_data(self, url):
return requests.get(url).content.decode()

def get_content(self, url):
response = self.get_data(url)
html = etree.HTML(response)

content = html.xpath(“//div[@class=’content’]/text()”)

return content

def parse_data(self, response):
html = etree.HTML(response)

el_list = html.xpath(“//div[@class=’article block untagged mb15 typs_hot’]”)
print(len(el_list))

temp_list = []
for el in el_list:
temp = {}
temp[“author”] = el.xpath(“./div[1]/a[2]/h2/text()”)[0].strip(“\n”)
temp[“href”] = “https://www.qiushibaike.com” + el.xpath(“./a[1]/@href”)[0]
temp[“content”] = self.get_content(temp[“href”])
temp[“smile_num”] = el.xpath(“./div[2]/span[1]/i/text()”)[0]
temp[“comment_num”] = el.xpath(“./div[2]/span[2]/a/i/text()”)[0]
# print(temp)
temp_list.append(temp)

try:
next_url = “https://www.qiushibaike.com” + html.xpath(“//span[@class=’next’]/../../a/@href”)[0]
except:
next_url = None

return temp_list, next_url

def save_data(self, temp_list):
with open(“qiushi.json”, “a”, encoding=”utf-8″) as f:
f.write(json.dumps(temp_list, ensure_ascii=False))
print(“保存成功!”)
print(temp_list)

def run(self):
next_url = self.url

while next_url:
response = self.get_data(next_url)
temp_list, next_url = self.parse_data(response)
self.save_data(temp_list)

if name == ‘main’:
qiushi = QiuShi()
qiushi.run()

 

如何让 FTP 支持播放视频文件?

*近购买了 Gear VR ,因为手机容量比较小,所以想通过 FTP 访问 PC 的媒体文件来播放。 下载安装了 Serv-U 试用版,尝试搭建了本机 FTP 服务器,在手机上通过 IP 可以正常访问,但是尝试播放其中的 MP4 文件却无法播放(点击进入播放后显示为无时长),图片可以正常打开。 所以,求助如何设置才可以播放?

第 1 条附言 · 2016-10-15 19:39:43 +08:00
谢谢各位朋友的回复。
目前使用了 Ngnix , everything , serv-u , hfs 等软件搭建的 HTTP/FTP 服务器,在手机浏览器上都无法正常播放视频,可能是无法调用播放器的原因。 ES 文件管理器+MX Player 的组合,因为无法在 Gear VR 中使用,所以也就作罢了。
之后找到一个软件:某镜 VR (为避免广告嫌疑,就不讲明软件名称了),内置的局域网功能可以播放 PC 上共享的文件,缺点是:需要开启网络共享。另外,播放的体验上也不好,缓冲的速度仅 1500-2000KB/s ,对 VR 视频来说,不太好,看几秒就缓冲,不过这应该是我的渣路由器的问题。
谢谢啦。

• 2016-12-10 09:18:10 +08:00
flyz 1
flyz 2016-10-15 13:28:03 +08:00 via Android
为什么不搭建 http 呢
pmpio 2
pmpio 2016-10-15 13:34:07 +08:00
一个几百 Kb 的 hfs.exe 就能搞定的事,你却搞这么复杂。。。。
sutra 3
sutra 2016-10-15 13:39:53 +08:00
换个播放客户端就可以了吧,我测试了在 macOS 上 mpv 似乎是可以播放 ftp 上的 mp4 的。
chanssl 4
chanssl 2016-10-15 14:25:05 +08:00
@pmpio HFS 试过啊,不行的。不能直接播放
v1024 5
v1024 2016-10-15 14:57:24 +08:00 via iPhone
似乎需要,被动模式?
magickzl 6
magickzl 2016-10-15 15:13:02 +08:00
手机 ES+mx player 不就解决了吗

自己的 NAS 就是这么看的啊。
ewex 7
ewex 2016-10-15 15:17:27 +08:00
Everything 自带搜索功能,可开 HTTP 和 FTP ,经常这样用。
loading 8
loading 2016-10-15 16:17:32 +08:00 via Android
@ewex 我也是用 everything ?
kkk330 9
kkk330 2016-10-15 16:56:44 +08:00
换 samba?
heiyutian 10
heiyutian 2016-10-15 17:26:14 +08:00 via iPhone
@ewex
@loading
安卓上这个软件怎么开 ftp ,没找到添加按钮呢

loading 2016-10-15 17:49:25 +08:00 via Android
@heiyutian 那是 windows 的软件……手机开浏览器
chanssl 12
chanssl 2016-10-15 17:50:07 +08:00
@magickzl Gear VR 不支持打开常规软件的。
chanssl 13
chanssl 2016-10-15 17:57:25 +08:00
@ewex @loading 试了 Everything ,也是一样的状况,纠结。
loading 14
loading 2016-10-15 18:00:07 +08:00 via Android
试一下 nginx + h5ai
lean 15
lean 2016-10-15 18:40:08 +08:00 via Android
samba+es
chanssl 16
chanssl 2016-10-15 19:39:51 +08:00
谢谢各位朋友的回复。
目前使用了 Ngnix , everything , serv-u , hfs 等软件搭建的 HTTP/FTP 服务器,在手机浏览器上都无法正常播放视频,可能是无法调用播放器的原因。 ES 文件管理器+MX Player 的组合,因为无法在 Gear VR 中使用,所以也就作罢了。
之后找到一个软件:某镜 VR (为避免广告嫌疑,就不讲明软件名称了),内置的局域网功能可以播放 PC 上共享的文件,缺点是:需要开启网络共享。另外,播放的体验上也不好,缓冲的速度仅 1500-2000KB/s ,对 VR 视频来说,不太好,看几秒就缓冲,不过这应该是我的渣路由器的问题。
谢谢啦。
miaomiao2015 17
miaomiao2015 2016-11-07 19:13:19 +08:00
手机是 iOS 还是啥? iOS 可以试试 Air Video ,电脑装 server 端,局域网内连就可以了。
chanssl 18
chanssl 2016-11-07 19:20:20 +08:00
@miaomiao2015 Android 。已经解决了。
kojirou 19
kojirou 2016-11-08 13:43:54 +08:00
vidon
Hardrain 20
Hardrain 2016-12-03 18:56:44 +08:00
HTTP Server+MX Player 网络流媒体

IIS7.5 、 Apache(XAMPP) on Win7 x64
Apache 2.4.18 on Ubuntu 16.04 x64 都可用
Nginx 没试过
chanssl 21
chanssl 2016-12-08 01:57:04 +08:00 via Android
@Hardrain
@kojirou 谢谢,但是我的需求场景是 VR , VR 场景下无法使用普通应用。
Hardrain 22
Hardrain 2016-12-10 09:18:10 +08:00
@chanssl 那就当做个参考吧……

Comet服务器推送与SignalR

HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议*典型的特点就是无状态且需要客户端发起Request服务端才能进行Response,这意味着服务端无法主动“推送”信息。但现代很多应用需求这种“服务端推送”,比如说监控系统、报价系统、游戏、协同文档、进度条等应用。因此本文会谈论服务器推送技术的不同手段,以及在Asp.Net中的SignalR是如何封装这些细节来达到推送的目的。

实现服务器推送的一些手段
由于HTTP协议并不支持全双工,因此目前对于服务器“推送”的手段也是根据HTTP协议的特性玩了很多小花招。但大体上可以分为高端大气的全双工类和略微tricky的长轮询类。Streaming类通常会有比较多的限制,比如说对浏览器的版本要求、需要使用sliverlight或flash等查件来实现全双工等。长轮询类主要是包括长轮询或不间断Ajax请求等。

Ajax定期请求方式

这种方式严格来说并不算是服务器推送,而是客户端在一个比较短的间隔内定期去服务器用Ajax请求信息,如果服务器端有了新的事件,则客户端在下一次请求就会获取到,并在客户端调用对应的回调函数来处理这些信息。简单的示意图如图1所示。

%title插图%num

图1.Ajax定期请求

当然,这种方式的一些缺点也是显而易见的,首先定期发起请求会白白消耗服务器资源,其次,这种方式也并不是真正的“实时”。

长连接的方式

长连接是另一种方式,是对于页面挂起一个额外的Ajax请求,当服务器有事件发生时,将请求返回给客户端,并在此挂起一个长连接。从而避免了定期请求的损耗,如图2所示。

%title插图%num

图2.长连接方式

这种方式的缺点同样显而易见,就是需要客户端和服务器对于这部分功能写自定义实现代码。

使用插件方式

使用诸如silverlight和flash等插件可以基于socket做全双工的通信,但这种方式需要特定的客户端,跨平台性并不好(比如手机客户端等不支持一些插件,PC端没有预装Silverlight等)。对条件限制比较严格。

Forever iFrame

这种方式本质上和长连接的方法非常类似,就是在页面中嵌入一个iframe元素,该元素的Src属性指向被请求的对象,服务端有事件发生就,就回传一个调用客户端JS方法的JS。Iframe中HTTP头的Transfer-Encoding属性为chunked,这意味着服务端并不知道要发送给客户端多少数据,也就隐式意味着该连接的长度为无限。

HTML5 Web Socket

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。

在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket协议的出现可以避免上述几种方式带来的服务器资源占用和宽带占用。但缺点也是很明显的,对客户端和服务端都有一定要求,包括浏览器的版本和服务器的版本(比如IIS7.5+)

SignalR?
上面说到了这么多中实现实时应用程序的办法,作为Asp.net框架中,提供了一个叫SignalR的框架来封装这些网络细节,SignalR会自动选择合适的实现技术来实现该种实时程序。我们只要关注更高层面的业务实现,而无需关注技术上的实现细节。

SignalR*低需要基于Jquery 1.6.4,在服务端至少需要是.Net FrameWork 4.0+。

使用SignalR会自动根据环境选择合适的网络实现细节,该过程根据微软的官网定义如下:

如果浏览器是IE8或低于IE8,使用长连接方式。
如果配置了JSONP参数,则使用长连接方式。
如果请求跨域,且客户端和服务器端都支持Web Socket,且客户端支持CORS,则使用Web Socket
如果没跨域,客户端和浏览器都支持的话,使用Web Socket方式
如果客户端或服务器端不支持Web Socket的话,会使用HTML5的Server-sent events
如果Server-Sent Event不被支持的话,会使用Forever iFrame
*后会使用长连接方式

SignalR的实现可以通过在Visual Studio的nuget来获取。SignalR从使用的角度来说模型非常简单,服务端是客户端回调用的HUB方法,而客户端只要引入了对应的JS之后,形成Hub-Proxy,使得服务端被调用后里的方法也可以回调不同的客户端。模型概念如图3所示。

%title插图%num

图3.SignalR的Hub模型

在服务端的Hub被调用后,我们可以处理该部分代码,并针对不同的客户端返回信息,一个典型的代码如图4所示。

%title插图%num

图4.一些返回给不同客户端的方法

而在客户端,我们仅仅需要引用SignalR的Js文件后,声明了Hub-Proxy,就可以直接调用服务器方法,如图5所示。

%title插图%num

图5.客户端直接调用服务端的方法

我们注意到,在使用SignalR的过程中,并没有任何关于网络交互技术细节的实现,仅仅是简单的调用。SignalR已经按照本文之前所提到的那样,根据Context选择的具体的实现细节。

批量获取京东数坊营销人群追踪新客数

批量获取京东数坊营销人群追踪新客数

 

 

requests + datetime + openpyxl代替点击、复制、粘贴

为甚数坊越是不能下载的数据,客户越喜欢看

 

实现遍历日期

import datetime

 

kaishi = datetime.date(2021, 2, 1)

jieshu = datetime.date(2021, 2, 21)

delta = datetime.timedelta(days=1)

d = kaishi

while d <= jieshu:

riqi = d.strftime(“%Y-%m-%d”)

 

结合request和openpyxl拿到一段时间内某活动的新客人数存进表格

个别变量使用拼音,部分内容脱敏处理,哈哈哈

 

from openpyxl import load_workbook

import requests

import datetime

import json

 

class TOOL():

 

def __init__(self):

self.url0 = “https://4a******”

self.url1 = “https://4a******”  # 购买人群概览

 

def get_deaders(self):

with open(‘cookie.txt’, ‘r’, encoding=’utf-8′) as f:

cookie = f.read()

headers = {

‘user-agent’: ‘Mozilla/5.0****87.0’,

‘cookie’: cookie,

“content-type”: ‘application/json;charset=UTF-8’

}

return headers

 

def get_name(self):

with open(‘name_list.txt’, encoding=’utf-8′) as f:

name = f.readlines()

name_list = map(lambda x: x.strip(), name)

return list(name_list)

 

def get_response(self, url, headers, params):

r = requests.get(url=url, headers=headers, params=params)

return json.loads(requests.get(url=url, headers=headers, params=params).text)

 

def get_id(self):

params = {

‘name’ : ‘banfadada’

}

data = self.get_response(self.url0, self.get_deaders(), params)[

“result”][“data”]

return data

 

def get_base_data(self, id, starDate, endDate):  # 购买人群概览

params = {

‘name’ : ‘banfadada’  # 设置新老客口径

}

try:

return self.get_response(self.url1, headers=self.get_deaders(), params=params)[‘result’]

except:

return ”

 

def Save_data(self, data):

workbook = load_workbook(filename=”xdm.xlsx”)

sheet = workbook.active

for r in data:

sheet.append(r)

workbook.save(filename=”xdm.xlsx”)

 

 

def main():

cool = TOOL()

id_list = cool.get_id()

name_list = cool.get_name()

for i in id_list:

name = i[‘name’]

if name in name_list:

print(name)

id = i[‘id’]

# 告诉我你的时间范围

kaishi = datetime.date(2021, 2, 18)

jieshu = datetime.date(2021, 2, 21)

delta = datetime.timedelta(days=1)

d = kaishi

shujv_list = []

while d <= jieshu:

riqi = d.strftime(“%Y-%m-%d”)

s = cool.get_base_data(id, starDate, riqi)[‘newConsumerCount’] # 新客人数

shujv_list.append(s)

d += delta

s_dict = [name, expandName]

li =  s_dict + shujv_list

save_data.append(li)

else:

pass

cool.Save_data(save_data)

 

 

if __name__ == ‘__main__’:

main()

 

注:使用前文件同级目录下需有cookie.txt、name_list.txt、xdm.xlsx文件

 

Conda环境离线迁移

Conda环境离线迁移

1. 背景
笔者所在公司*近要在局域网内部署NLP算法模型,由于需求方对数据安全有严格要求,新服务器所在局域网不能直接访问Internet,因此需要将模型所需的运行环境离线迁移到新服务器中。

2. 方案
2.1 conda-pack
conda-pack是一个命令行工具,用于打包conda环境。该命令会将坏境中安装的软件包的二进制文件进行打包。
注:本方法不需要下载安装包,因此,conda-pack需要指定平台和操作系统,目标计算机必须于源计算机有相同的平台和操作系统。

2.1.1 打包
在conda的base环境中安装conda-pack;
pip install conda-pack
1
打包一个环境
# Pack environment my_env into my_env.tar.gz
conda pack -n my_env

# Pack environment my_env into out_name.tar.gz
conda pack -n my_env -o out_name.tar.gz

# Pack environment located at an explicit path into my_env.tar.gz
conda pack -p /explicit/path/to/my_env

2.1.2 重现
# Unpack environment into directory `my_env`
mkdir -p my_env
tar -xzf my_env.tar.gz -C my_env

# Use Python without activating or fixing the prefixes. Most Python
# libraries will work fine, but things that require prefix cleanups
# will fail.
./my_env/bin/python

# Activate the environment. This adds `my_env/bin` to your path
source my_env/bin/activate

# Run Python from in the environment
(my_env) $ python

# Cleanup prefixes from in the active environment.
# Note that this command can also be run without activating the environment
# as long as some version of Python is already installed on the machine.
(my_env) $ conda-unpack

2.2 pip download
利用pip将服务运行所依赖的包下载到本地,拷贝到目标服务器进行离线安装。

保存虚拟环境到requirements.txt
pip list –format=freeze > requirements.txt

备注: 此处不使用pip freeze命令是因为pip freeze导出的文件会出现@ file://的问题,导致后续下载依赖包的时候出现问题。

下载依赖包到指定目录
pip download -r requirements.txt -d “/home/admin/packs” -i https://pypi.tuna.tsinghua.edu.cn/simple

将requirements.txt和依赖包拷贝到目标服务器
在目标服务器创建conda虚拟环境
conda create -n my_env python=3.6.5 pip=10.0.1 –offline

备注:

–offline:指定离线创建虚拟环境;
python=3.6.5 & pip=10.0.1:指定默认的python版本号、并安装pip工具,如果不安装pip,则改虚拟环境使用默认的pip工具,就无法将依赖包安装到新虚拟环境。Anaconda自带的package在anaconda3/pkgs目录下,可自行查看;
切换到虚拟环境,并安装依赖包
pip install -U –no-index –find-links=./packs -r requirements.txt

备注: 若出现Cannot uninstall ‘xxxx’. It is a distutils installed project and thus we cannot accurately det…(xxx是某package的名称),使用如下命令进行解决:

pip install -U –ignore-installed –no-index –find-links=./packs xxx

python列表

python列表

1. 列表的创建:方括号 / 使用内置函数list()
列表:类似数组。和变量类似,实际存储了id(id类似指针),id指向了存储块,块内存储了id、值和类型。而列表名list则指向了*个元素的id(类似数组首地址)

lst1 = [“cc” , “vv” , 99] #方括号方式创建
lst2 = list([“aa” , “ss” , 88]) #内置函数list()方式创建
1
2. 列表的特点
列表元素按顺序有序排列
索引映射唯一的数据(从0数则从头开始:0、1、2…)(从-1数则从后向前:…-3、-2、-1)
列表可以存储重复元素
任意数据类型可以混存
根据需要动态分配和回收内存
3. 列表的索引查找index(value,start,stop)
如果列表中有多个重复的值,则只返回*个值的索引
若查找的值在列表中不存在,则抛出ValueError
可以指定start和stop之间查找[start,stop)
这里查找时不包括stop索引的
4. 获取列表中的多个元素(切片操作)
语法格式:[start:stop:step] 分别代表起始位置和步长
切片的结果是原列表的拷贝(也就是切出来的是一个新的列表对象,不是原本的列表对象了)
切片范围:[start , stop)
不写step:默认步长为1
【step为正数】不写start:默认从0开始
【step为正数】不写stop:默认切到*后
【step为负数】不写start:默认从*后一个开始
【step为负数】不写stop:默认切到*个
print(‘———–获取列表中的多个元素(切片操作)—————-‘)
lst = [’11’,’22’,’33’,44,’55’,66,77,88,99]
print(‘———-step为负数情况—————————–‘)
print(lst[1:6:1]) #从下标1开始,切到下标6之前结束。步长为1
print(lst[:6:2]) #从*个元素开始,切到下标6之前结束。步长为2
print(lst[2::2]) #从下标2开始,切到*后一个元素结束。步长为2
print(‘———-step为负数情况—————————–‘)
print(lst[::-1]) #从*后一个元素开始,切到*个元素结束,逆序
print(lst[:6:-2]) #从*后一个元素开始,切到下标6之前结束。步长为2,逆序
print(lst[2::-2]) #从下标2开始,切到*个元素结束。步长为2,逆序

5. 列表元素的增加操作(原地增加)
append(value):在列表末尾添加一个元素
extend(value):在列表末尾至少添加一个元素
insert(index,value):在列表的任意位置添加一个元素
切片:在列表的任意位置至少添加一个元素
print(“————-列表添加元素操作—————–“)
lst = [1,2,3,4,5,6]
newLst = list(“hello”)
lst.append(100) #添加100到列表后面
lst.append(newLst) #添加一个列表作为一个元素加入到lst列表的末尾
lst.extend(newLst) #添加一个列表,其每个元素都是一个独立的元素加入到lst列表的末尾
lst.insert(1,777)

print(‘—————切片增加操作—————–‘)
boolLst = [True,False]
lst[1:] = boolLst #注意!这里只有一个冒号,表示从哪里插入,并取代后面所有元素
print(lst) #结果为 [1,True,False]

6. 列表元素的删除操作
remove():一次删除一个元素,有重复则删除*个,元素不存在抛出ValueError
pop():删除一个指定索引上的元素,指定索引不存在则抛出IndexError,若不指定索引则默认删除*后一个元素
切片:一次至少删除一个元素
clear():清空列表所有元素
del():删除列表对象
print(“————列表删除操作——————-“)
lst = [10,20,30,40,50,60,30,40,50]
lst.remove(30) #删除*个值为30的元素
lst.remove(100) #ValueError错误
lst.pop(1) #删除索引为1的元素
lst.pop(9) #IndexError错误
lst.pop() #默认删除*后一个元素

print(“———-切片删除(但切片操作会产生新的列表对象)—————–“)
lst = [1,2,3,4,5,6]
newLst = lst[1:3] #将会切出一个新的列表对象
print(newLst) #结果为:[2,3]
print(lst) #原列表不变
”’不产生新的列表对象”’
lst[1:3] = [] #将1到3索引的元素置空
print(lst) #结果为:[1,4,5,6]

lst.clear(); #清空列表所有元素
del lst #删除列表对象
1
7. 列表元素的修改操作
lst = [1,2,3]
lst[1] = 7
lst[1:3] = [22,33,44,55]

8. 列表元素的排序操作
sort():列中元素默认按从小到大排序,可指定reverse = True,进行降序排列【原地修改】
sorted():可指定reverse = True,进行降序排列,原列表不发生变化【会产生一个新的列表对象】
print(‘————-sort()列表排序,原地修改———————–‘)
lst = [3,2,5,6,1,8]
lst.sort() #表示从小到大排列
lst.sort(reverse=True) #reverse=True表示从大到小排列
print(‘————-sorted()列表排序,产生一个新的列表对象———————–‘)
new_lst = sorted(lst) #原列表不会变化,产生的新列表变化
new_lst2 = sorted(lst,reverse=True) #原列表不会变化,产生的新列表变化(降序)

9.列表生成式
格式:[i*i for i in range(1,10)]

lst = [i for i in range(1,10)]
print(lst) #结果:[1,2,3,4,5,6,7,8,9]

解决代码提示报错问题

jupyter-notebook 解决代码提示报错问题

[IPKernelApp] ERROR | Exception in message handler:
Traceback (most recent call last):
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/ipykernel/kernelbase.py”, line 261, in dispatch_shell
yield gen.maybe_future(handler(stream, idents, msg))
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/tornado/gen.py”, line 762, in run
value = future.result()
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/tornado/gen.py”, line 234, in wrapper
yielded = ctx_run(next, result)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/tornado/gen.py”, line 162, in _fake_ctx_run
return f(*args, **kw)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/ipykernel/kernelbase.py”, line 576, in complete_request
matches = yield gen.maybe_future(self.do_complete(code, cursor_pos))
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/ipykernel/ipkernel.py”, line 356, in do_complete
return self._experimental_do_complete(code, cursor_pos)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/ipykernel/ipkernel.py”, line 381, in _experimental_do_complete
completions = list(_rectify_completions(code, raw_completions))
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/IPython/core/completer.py”, line 484, in rectify_completions
completions = list(completions)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/IPython/core/completer.py”, line 1818, in completions
for c in self._completions(text, offset, _timeout=self.jedi_compute_type_timeout/1000):
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/IPython/core/completer.py”, line 1862, in _completions
full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/IPython/core/completer.py”, line 2030, in _complete
cursor_pos, cursor_line, full_text)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/IPython/core/completer.py”, line 1374, in _jedi_matches
text[:offset], namespaces, column=cursor_column, line=cursor_line + 1)
File “/Users/wys/opt/anaconda3/envs/tf/lib/python3.6/site-packages/jedi/api/__init__.py”, line 726, in __init__
omitted, Jedi will be clever and try to define the range itself.
TypeError: __init__() got an unexpected keyword argument ‘column’

根据报错可以看出是 jedi 的工具包出现了问题,经过网上查询,ipython 目前*新的版本无法正确调用*新的 jedi 0.18.0 版本,那就把 jedi 版本降级到 0.17 即可。

通过 conda 检索已安装的jedi版本:

conda list|grep jedi

发现果然是 0.18 版本,然后改装成 0.17

conda install jedi=0.17

重新启动 jupyter-notebook ,解决问题。