Other

python生成器

生成器 我们学习完推导式之后发现,推导式就是在容器中使用一个for循环而已,为什么没有元组推导式? 原因就是“元组推导式”的名字不是这样的,而是叫做生成器表达式。 什么是生成器 生成器表达式本质上就是一个迭代器,是定义迭代器的一种方式,是允许自定义逻辑的迭代器。生成器使用generator表示。 迭代器和生成器的区别 迭代器本身是系统内置的, 无法重写内置的逻辑结构;而生成器是用户自定义的,可以重写逻辑结构。所以生成器就是一个迭代器,只是我们将自己写的迭代器叫做生成器作为区分而已。 创建方式 生成器有两种创建方式 生成器表达式,就是“元组推导式” 生成器函数,就是使用def定义,里面使用yield关键字 生成器表达式 基本语法 from collections import Iterator, Iterable # 生成器表达式(元组推导式) gen = (i * 2 for i in range(1, 11)) print(isinstance(gen, Iterable)) # 判断是否是迭代对象 print(isinstance(gen, Iterator)) # 判断是否是迭代器 # 这个 gen 就是生成器 生成器函数 我们上面说到,生成器函数如何定义?其实和普通的函数定义的方法是一样的,都是要使用def关键字来定义,其它的写法没有任何要求,普通函数怎么写生成器函数就怎么写,唯一的要求就是要使用yield关键字。 要注意,生成器函数就是一个函数,是使用了yield的函数,只不过生成器函数是用来定义生成器的。 yield关键字 yield这个关键字其实类似于return关键字,return关键字的作用是在函数中使用,用来返回数据,yield关键字的作用也是一样的,就是用来返回数据,但是和return还有其它的不同之处。 yield和return 共同点 执行到对应语句的时候,就会返回对应的值。 不同点 return执行的时候,函数就跳出,然后return之后的所有作用域语句就会全部跳出,当函数再次调用的时候,整个函数就重新执行。 yield执行的时候,返回数据,但是函数就会记住跳出的位置,当你再次调用函数(生成器)的时候,就从上一次跳出的地方继续执行,是不是和迭代器的取值有异曲同工之处? yield的使用方法 yield的使用方法有两种,一种是和return的使用方法一样,在关键字的后面直接添加返回值,这是推荐使用的方法; 第二种方法使用将yield作为一个函数使用,就是在yield后面使用括号,在括号中填写返回的值。 生成器函数的基本使用 # 1、定义一个生成器函数 # 生成器函数就是一个使用yield的函数 def myGen(): print(1) yield 11 print(2) yield 22 print(3) yield 33 # 2、初始化生成器 # 执行生成器函数,返回一个对象,就是生成器对象,简称生成器 from collections import Iterator gen = myGen() res = isinstance(gen, Iterator) print(res) # True 返回True说明生成器本质上就是一个迭代器 # 3、调用生成器 # 生成器本质上就是一个迭代器,还记得迭代器如何调用吗? res = next(gen) print(res) 结果: 1 (生成器函数中的语句 print(1)) 11 (yield返回的值,print(res)) send的使用 send和next一样,都是用来取出迭代器中的值的函数,send是生成器的内置函数。而且send和next相比,功能更加的强大,next只能取值;send不但能取值,而且还能发送值。

Android 常见问题

More than one file was found 这种情况属于依赖项中存在多个同名文件,系统不知道选择那个进行编译。 解决办法: 在app目录下的build.gradle文件中添加以下代码 packagingOptions { exclude 'META-INF/DEPENDENCIES' } exclude 什么取决于编译器报什么样的 more than one file was found

aconda安装tensorflow-gpu版本

1安装aconda     2安装cuda 查询tensoflow对应的cuda和python关系 官网 https://tensorflow.google.cn/install/source_windows?hl=en#gpu 网友 https://blog.csdn.net/K1052176873/article/details/114526086 CUDA与显卡驱动:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html TensorFlow-GPU与CUDA cudnn Python版本关系:https://tensorflow.google.cn/install/source_windows?hl=en#gpu CPU    以下是windows的对应关系,Linux和macOS的对应关系在上面的链接里面   GPU    安装cuda和cudnn     假设这里安装 tensorflow-gpu==1.14.0 keras-gpu=2.2.4 对应cuda10. cudnn-7.4     但是从cuda官网看 cudnn7.6也是可以用的      下载cuda10 https://developer.nvidia.com/cuda-10.0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal   解压安装包       1,在组件CUDA中将Visual Studio Intergration取消掉。这个还是蛮有意思的,因为这个组件是专为VS配置的,但是现在使用的代码编译器基本都是vscode,pycharm等轻量编译器之流,用VS就比较没意义了;我在网上还看见一个说法,这个必须取消掉,不然没法正确安装。反正取消就完事了。    2 CUDA在安装的时候会默认安装一个NVDIA的显卡驱动。上图可以看出,该显卡驱动版本是411.31。划重点:“当前版本”这一栏会显示你目前电脑上的显卡驱动型号,比如上图所示,我的电脑目前驱动是430.86,这个数字大于411.31,说明版本更新一些。如果你的当前版本高于CUDA想要安装的新版本,那么一定要把display driver取消掉!不然CUDA安装发现你现有的比我要安的还高级,我还安个锤子,就会出现安装失败的错误;如果你的当前版本低于CUDA想要安装的新版本,那么一定要把display driver勾选,驱动版本不够新,CUDA也运行不了。如果巧了当前版本与新版本一模一样,那勾不勾选随意。

airtest

1:参考文档 https://airtest.netease.com/https://airtest.doc.io.netease.com/ https://airtest.readthedocs.io/zh_CN/latest/airtest通过图像识别来完成对自动化元素的识别屏幕上截图,了解业务功能就能完成自动化测试脚本的编写  2:airtest原理 1:airtest通过adb(安卓 debug bridge|安卓调试桥梁)完成手机连接到电脑并且操作的过程2:airtest安装目录下:E:\Airtest\AirtestIDE-win-1.2.13\AirtestIDE\airtest\core\android\static\adb\windows airtes自带了adb的两个dell文件和adb.exe文件 当前文件目录:shift+鼠标右键——>在此处打开命令创建3:手机通过数据线连接到电脑 1:需要安装手机对于的驱动,确保手机能够被电脑识别 2:打开手机的开发者选项,usb调试模式 3:打开指针位置,让在鼠标上的点击操作看到相应的坐标值 4:有些手机连接上弹出RSA密钥验证,请点击允许 5:adb devices 验证手机成功连接上  

图文解说ChinaCock高德地图组件-显示多个标注(四)

前文介绍了如何在地图上通过设置标注来采集位置的经纬度,当用户采集了多个实体的位置信息后,我们就可以在地图上一次性显示这些实体的标注了! 基于前文,接下来在地图上的做标注就很简单了,可以复用以前的代码,具体参阅:图文解说ChinaCock高德地图组件采集坐标 (二) 接下来,我们再做一个过程: procedure TMarkerMapFrame.MarkerAll; var mk: TCCuniGUIAMap.TMarker; begin with UniMainModule do begin q.Close; q.Query.Text := '你的查询语句'; q.Open; q.First; while not q.Eof do begin mk := AddMarker(q.FieldByName('FJD').AsFloat, q.FieldByName('FWD').AsFloat, q.FieldByName('FName').AsString); if (q.FieldByName('FJD').AsString <> '') and (q.FieldByName('FJD').AsString <> '') then begin mk:= AddMarker(q.FieldByName('FJD').AsFloat, q.FieldByName('FWD').AsFloat, q.FieldByName('FName').AsString); mk.CustomParams.Values['name']:=q.FieldByName('FName').AsString; end; q.Next; end; end; // 适应地图对象 让所有对象都在地图最佳区域内 self.CCuniGUIAMap1.SetFitView(True); end; 该过程,通过查询一个TDataSet并循环这个数据集,在循环过程中调用AddMarker方法,在地图上画出每个实体的标注。 画完所有的标注,调用地图的SetFitView方法,让所有的标注点正好都显示在地图上。 同样,基于前文,可以实现当用户鼠标移动到一个标注时显示他的名称,但问题来了,如果用户想了解一个标注点时,如何支持呢? 这里,我是这样实现的,就是当用户在一个标注点上单击鼠标,隐藏原来的名称标签,换成一个大的标签来显示详细信息。 在实现的过程中,测试了两种方案,都可以满足上面的需求,接下来,分别介绍这两种方案的实现过程: 一、纯Delphi实现方式 利用一个uniPanel组件,基于他设计详细的显示内容,注意这里的优点,就是可视化的设计这个Panel,发挥想象,你可以放置任意你想放置的可视控件进去。 二、标签实现方式 基于地图控件的Text属性来显示详细内容,与前文的实现,利用标签Text对象显示标注的名称是一样的过程,只不过这里显示更多的内容。这种方式的优点是完全与地图集成一体,运行效率效率高。  

Java三大版本和JDK、JRE、JVM

Java三大版本和JDK、JRE、JVM Java三大版本 JavaSE、JavaME、JavaEE JDK、JRE、JVM JDK:Java Development Kit Java开发工具 JRE:Java Runtime Environment Java运行环境 JVM:Java Virtual Machine Java虚拟机

安装java开发环境

卸载JDK 删除Java的安装目录 删除电脑-属性-高级系统设置-环境变量中的JAVA_HOME 删除path下关于Java的目录(两个) cmd中输入java -version查看是否卸载 安装JDK 甲骨文网站搜索JDK8下载 双击安装JDK 记住安装的路径 配置环境变量 我的电脑-->属性-->高级系统设置 环境变量-->JAVA_HOME 配置path变量 测试JDK是否安装成功,打开cmd输入java -version看是否出现版本名 下载notepad++ notepad++官网:https://notepad-plus-plus.org/ notepad++项目主页:https://github.com/notepad-plus-plus/notepad-plus-plus/

【C# 数据结构与算法】队列 queue

队列 队列又称为“先进先出”(FIFO)线性表限定插入操作只能在队尾进行,而删除操作只能在队首进行,Front对头指针指向第一元素;Rear队尾指针指向下一个入队的元素。队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列空队列:front == rear;  顺序队列 用一组连续的存储单元依次存放从队首到队尾的元素,附设两个指针head和tail分别指向队首元素和队尾元素的位置,(有的地方用front 和 rear 表示) Front是处于队头的数据元素的下标 简称对头下标,rear 不是当前队尾元素的下标,而是下一个入队的数据元素下标。 顺序队列中出现的剩余存储空间但不能进行新的入队操作的溢出称为假溢出。循序循环队列为了解决假溢出的方案。      循环队列 所谓 的顺序循环队列,是通过取模操作,将为顺序队列所分配的连续存储空间,变成一个逻辑上首位相连的“环形”队列。 为了实现顺序队列循环利用存储空间,进行入队和出队操作时,front和rear 不是简单的加1,而是加1后取模做取模操作。即如下操作: IsFull: front== (rear + 1) % item.Length;IsEmpty:front == rear;Count: (rear - front + item.Length) % item.Length; 自定义循环队列 using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing.Drawing2D; using System.IO; using System.Text; using System.Threading; using System.Xml; using System.Xml.XPath; namespace LinearList; public class Sample { public static void Main() { SequencedQueue<int> queue = new SequencedQueue<int>(); for (int i = 0; i < 20; i++) { queue.

VIM常用快捷键

一、移动光标 h j k l 上 下 左 右 ctrl-y 上移一行 ctrl-e 下移一行 ctrl-u 上翻半页(up) ctrl-d 下翻半页(down) ctrl-f 上翻一页(forward) ctrl-b 下翻一页(backward) w 跳到下一个字首,按标点或单词分割 W 跳到下一个字首,长跳,如end-of-line被认为是一个字 e 跳到下一个字尾 E 跳到下一个字尾,长跳 b 跳到上一个字 B 跳到上一个字,长跳 0 跳至行首,不管有无缩进,就是跳到第0个字符 ^ 跳至行首的第一个字符 $ 跳至行尾 gg 跳至文首 G 调至文尾 5gg/5G 调至第5行 gd 跳至当前光标所在的变量的声明处 fx 在当前行中找x字符,找到了就跳转至 ; 重复上一个f命令,而不用重复的输入fx * 查找光标所在处的单词,向下查找 # 查找光标所在处的单词,向上查找 二、删除复制 dd 删除光标所在行 dw 删除一个字(word) d/D 删除到行末 x 删除当前字符 X 删除前一个字符 yy 复制一行 yw 复制一个字 y/Y 复制到行末 p 粘贴粘贴板的内容到当前行的下面 P 粘贴粘贴板的内容到当前行的上面 三、插入模式 i 从当前光标处进入插入模式 I 进入插入模式,并置光标于行首 a 追加模式,置光标于当前光标之后 A 追加模式,置光标于行末 o 在当前行之下新加一行,并进入插入模式 O 在当前行之上新加一行,并进入插入模式 Esc 退出插入模式 四、编辑 J 将下一行和当前行连接为一行 cc 删除当前行并进入编辑模式 cw 删除当前字,并进入编辑模式 c$ 擦除从当前位置至行末的内容,并进入编辑模式 s 删除当前字符并进入编辑模式 S 删除光标所在行并进入编辑模式 xp 交换当前字符和下一个字符 u 撤销 ctrl+r 重做 ~ 切换大小写,当前字符 >> 将当前行右移一个单位 << 将当前行左移一个单位(一个tab符) == 自动缩进当前行 五、查找替换 /pattern 向后搜索字符串pattern ?