首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

带你入门比Python更高效的Numpy(附代码)

简介 向量化技巧对于数据科学家来说是相当熟知的,并且常用于编程中,以加速整体数据转换,其中简单的数学变化通过可迭代对象(例如列表)执行。未受到重视的是,把有一定规模的代码模块,如条件循环,进行矢量化,也能带来一些好处。正文 Python正在迅速成为数据科学家的编程实战语言。但与R或Julia不同的是,它是通用型编程语言,没有功能语法来立即开始分析和转换数值数据。所以,它需要专门的库。 Numpy是Numerical Python的缩写,是Python生态系统中高性能科学计算和数据分析所需的基础软件包。它是几乎所有高级工具(如Pandas和scikit-learn)的基础。 TensorFlow使用NumPy数组作为基础构建模块,在这些模块的基础上,他们为深度学习任务(在长列表/向量/数字矩阵上大量使用线性代数运算)构建了张量对象(Tens

优秀的个人博客,低调大师

TensorFlow.js入门(一)一维向量的学习

TensorFlow的介绍 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。 TensorFlow是一个著名的开源的人工智能系统,被广泛应用于语音识别或图像识别等多项机器学习和深度学习领域。它目前支持的程序语言有: Java, Python, Go, Lua, R, JavaScript, 其中2018年3 月 31 日 ,TensorFlow 宣布增加支持 JavaScript,并推出开源库 TensorFlow.js 。 我们将会介绍在前端开发中TensorFlow的相关内容,即TensorFlow.js的学习与应用。 Tensorflow中的一维向量及其运算 tensor 是 TensorFlow.js 的数据中心单元:由一组数值组成的一维或多维数组。在 TensorFlow.js中,一维向量的构造函数主要为:tf.tensor()和tf.tensor1d(),具体的API文档可以参考:https://js.tensorflow.org/api/0.12.0/ 。 可以用set()和get()函数分别获取和设置向量中的元素值。 一维向量的运算函数有很多,说明如下: tf.add() 两个向量的对应元素的和 tf.sub() 两个向量的对应元素的差 tf.mul() 两个向量的对应元素的乘积 tf.div() 两个向量的对应元素的商 tf.maximum() 两个向量的对应元素的最大值 tf.minimum() 两个向量的对应元素的最小值 tf.pow() 两个向量的对应元素的幂 以上只是一部分,还有更多的函数如: tf.abs(), tf.sin(), tf.cos(), tf.tan(), tf.tan()等。 简单例子 在网页中引入TensorFlow.js需要添加“script”标签,如下: <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script> 我们通过一个小小的例子,来说明在TensorFlow.js中一维向量的使用方法,其完整的HTML代码如下: <html> <head> <!-- Load TensorFlow.js --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script> <!-- Place your code in the script tag below.--> <script> function show(){ var a = [1,2,3,4,5]; var b = [2,3,4,5,6]; const vector1 = tf.tensor(a); const vector2 = tf.tensor(b); const res = vector2.add(vector1); document.getElementById("first_element").innerHTML = "第一个元素为" + res.get(0)+ "."; document.getElementById("whole_array").innerHTML = "向量:"+res; } </script> </head> <body> <p id="first_element"></p> <p id="whole_array"></p> <button onclick="show()" id="show" value="show">show</button> </body> </html> 显示的网页如下图: 实战 在刚才的例子中,我们仅仅只给出了一个简单的例子,那么,如果要实现稍微复杂一点的功能呢,比如下面的网页: 我们可以用TensorFlow.js来实现这些向量运算。该网页的完整的HTML代码如下: <html> <head> <!-- Load TensorFlow.js --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src="tf_result.js"></script> </head> <body> <center> <h2>TensorFlow向量(一维)学习</h2> <br><br> <div style="width:600px"> <div> <label class="col-sm-2 control-label">向量运算</label> <div class="col-sm-10"> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="add" checked="checked"> 加 </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="sub"> 减 </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="mul"> 乘 </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="div"> 除 </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="max"> max </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="min"> min </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="abs"> abs </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="sin"> sin </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="cos"> cos </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="tan"> tan </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="exp"> exp </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="log"> log </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="sqrt"> sqrt </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="square"> square </label> <label class="radio-inline"> <input type="radio" name="optionsRadiosinline" value="cubic"> cubic </label> <br><br> </div> </div> <div> <label for="vector1" class="col-sm-2 control-label">向量1</label> <div class="col-sm-10"> <input type="text" class="form-control" id="vector1" placeholder="向量1"> <br> </div> </div> <div> <label for="vector2" class="col-sm-2 control-label">向量2</label> <div class="col-sm-10"> <input type="text" class="form-control" id="vector2" placeholder="向量2"> <br> </div> </div> <div > <div class="col-sm-offset-2 col-sm-10"> <button class="btn btn-default" id="result">显示结果</button> <button class="btn btn-default" id="clc">清空</button> </div> </div> </div> <table class="table" style="width:600px"> <caption id="tf">运行结果</caption> <tbody> <tr class="success" id="table"> </tr> </tbody> </table> </center> </body> </html> 在其中我们用到了tf_result.js,其完整的JavaScript代码如下: $(document).ready(function(){ var flag; /* flag = 1表示一元运算 flag = 2表示二元运算 */ // 清空两个输入框的输入 $("#clc").click(function(){ $("#vector1").val(""); $("#vector2").val(""); }); // 是否允许"向量2"输入框有输入 $("#vector1").click(function(){ var op = $("input[name='optionsRadiosinline']:checked").val(); var ops = ["add", "sub", "mul", "div", "max", "min"]; if (ops.indexOf(op) == -1) flag = 1; else flag = 2; //文本框"向量2"禁用 if(flag == 1){ $("#vector2").val(""); $("input[type='text']").each(function () { $("#vector2").attr("disabled", true); }); } //文本框"向量2"启用 if(flag == 2){ $("input[type='text']").each(function () { $("#vector2").attr("disabled", false); }); } }); // 利用tensorflow.js的运算函数,输出计算结果 $("#result").click(function(){ if(flag == 1){ var vector1 = $("#vector1").val().split(',').map(Number); } if(flag == 2){ var vector1 = $("#vector1").val().toString().split(',').map(Number); var vector2 = $("#vector2").val().toString().split(',').map(Number); if(vector1.length != vector2.length) alert("输入的两个向量长度不一样"); } // 利用tensorflow.js的运算函数 if( flag == 1 || ((flag == 2) && (vector1.length == vector2.length))){ var op = $("input[name='optionsRadiosinline']:checked").val(); const pow2 = tf.tensor(2).toInt(); // 计算平方 const pow3 = tf.tensor(3).toInt(); // 计算三次方 switch (op) // JavaScript的switch结构 { case "add": // 加法 res = tf.tensor(vector1).add(tf.tensor(vector2)); break; case "sub": // 减法 res = tf.tensor(vector1).sub(tf.tensor(vector2)); break; case "mul": // 乘法 res = tf.tensor(vector1).mul(tf.tensor(vector2)); break; case "div": // 除法 res = tf.tensor(vector1).div(tf.tensor(vector2)); break; case "max": // 两个向量中的最大值,element-wise res = tf.tensor(vector1).maximum(tf.tensor(vector2)); break; case "min": // 两个向量中的最小值,element-wise res = tf.tensor(vector1).minimum(tf.tensor(vector2)); break; case "abs": // 绝对值 res = tf.tensor(vector1).abs(); break; case "sin": // 正弦函数 res = tf.tensor(vector1).sin(); break; case "cos": // 余弦函数 res = tf.tensor(vector1).cos(); break; case "tan": // 正切函数 res = tf.tensor(vector1).tan(); break; case "exp": // 指数函数,以e为底 res = tf.tensor(vector1).exp(); break; case "log": // 对数函数,以e为底 res = tf.tensor(vector1).log(); break; case "sqrt": // 平方根 res = tf.tensor(vector1).sqrt(); break; case "square": // 平方 res = tf.tensor(vector1).pow(pow2); break; case "cubic": // 三次方 res = tf.tensor(vector1).pow(pow3); break; default: res = tf.tensor([]); } $("#table").html(""); // 清空原有表格中的数据 // 输入计算结果 for(var i=0; i< res.shape; i++){ $("tr").append("<td>"+res.get(i)+"</td>;"); } } }); }); 运行刚才的网页,效果如下: 怎么样,是不是觉得TensorFlow.js也酷酷的呢?结合TensorFlow.js以及前端网页方面的知识,我们可以给出许多酷炫的TensorFlow的应用,以后我们会慢慢讲到。本次项目的Github地址为:https://github.com/percent4/tensorflow_js_learning 。 注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

优秀的个人博客,低调大师

Java并发编程 -- AQS入门&实现可重入锁

Java并发编程 -- AQS可能会看的一脸懵逼,今天实战一个项目练手AQS MyAQSLock.java /** * Created by Fant.J. */ public class MyAQSLock implements Lock { private Helper helper = new Helper(); private class Helper extends AbstractQueuedSynchronizer { @Override protected boolean tryAcquire(int arg) { // 如果第一个线程进来,可以拿到锁,因此我们可以返回true // 如果第二个线程进来,则拿不到锁,返回false。有种特例,如果当前进来的线程和当前保存的线程是同一个线程,则可以拿到锁,但是有代价,要更新状态值 // 如何判断是第一个线程进来还是其他线程进来? //获取状态值 int state = getState(); Thread t = Thread.currentThread(); //如果状态=0,那就是第一个线程 if (state == 0) { if (compareAndSetState(0, arg)) { //设置当前线程为独占锁线程 setExclusiveOwnerThread(t); return true; } } else if (getExclusiveOwnerThread() == t) { setState(state + 1); return true; } return false; } @Override protected boolean tryRelease(int arg) { // 锁的获取和释放肯定是一一对应的,那么调用此方法的线程一定是当前线程 //获取当前线程,如果不等于独占锁的线程 if (Thread.currentThread() != getExclusiveOwnerThread()) { throw new RuntimeException(); } int state = getState() - arg; boolean flag = false; if (state == 0) { setExclusiveOwnerThread(null); flag = true; } setState(state); return flag; } Condition newCondition() { return new ConditionObject(); } } @Override public void lock() { helper.acquire(1); } @Override public void lockInterruptibly() throws InterruptedException { helper.acquireInterruptibly(1); } @Override public boolean tryLock() { return helper.tryAcquire(1); } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return helper.tryAcquireNanos(1, unit.toNanos(time)); } @Override public void unlock() { helper.release(1); } @Override public Condition newCondition() { return helper.newCondition(); } } 从上往下分析,首先继承Lock接口,然后定义一个子类为非公共内部帮助器类Helper类,Helper类继承AQS,重写它的tryAcquire和tryRelease方法。作为锁的获取和释放。然后填充Lock的子类实现。(为什么Lock子类方法里传值都是1呢,因为AQS源码就是这样,1一路传到底),注释还算详细,就不在这多说了。 /** * Created by Fant.J. */ class TestAQS { private int value; private MyAQSLock myAQSLock = new MyAQSLock(); public int next(){ myAQSLock.lock(); try { Thread.sleep(300); return value++; } catch (InterruptedException e) { throw new RuntimeException(); }finally { myAQSLock.unlock(); } } public void a() { myAQSLock.lock(); System.out.println("a"); b(); myAQSLock.unlock(); } public void b() { myAQSLock.lock(); System.out.println("b"); myAQSLock.unlock(); } public static void main(String[] args) { TestAQS test = new TestAQS(); new Thread(new Runnable() { @Override public void run() { test.a(); } }).start(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+test.next()); } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+test.next()); } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+test.next()); } } }).start(); } } 开了四个线程,一个线程去跑a方法,a方法中调用b方法,a、b方法调用之前都有加锁,之后有解锁,这个线程用来做可重入锁的测试,其他三个线程是测试线程安全。 结果图

优秀的个人博客,低调大师

【HBase从入门到精通系列】误删数据如何抢救?

前言 有时候我们操作数据库的时候不小心误删数据,这时候如何找回?mysql里有binlog可以帮助我们恢复数据,但是没有开binlog也没有备份就尴尬了。如果是HBase,你没有做备份误删了又如何恢复呢? 数据保护 当误删数据发生时候,不管三七二十一,第一要务是进入hbase shell,执行如下命令: alter 't', { NAME => 'f', KEEP_DELETED_CELLS => TRUE } 如果误删一张表的有多个family里的数据,需要都执行一下: alter 'tt', { NAME => 'f1', KEEP_DELETED_CELLS => TRUE }, { NAME => 'f2', KEEP_DELETED_CELLS => TRUE } 设置 KEEP_DELETED_C

优秀的个人博客,低调大师

手把手教你入门Hadoop(附代码&资源)

GETINDATA公司创始人兼大数据顾问彼得亚·雷克鲁斯基(Piotr Krewski)和GETINDATA公司首席执行官兼创始人亚当·卡瓦(Adam Kawa) 目录 内容简介 设计理念 HADOOP组件 HDFS YARN YARN 应用程序 监控 YARN 应用程序 用HADOOP处理数据 HADOOP 的其它工具 其它资源 内容简介 Hadoop是目前最流行的大数据软件框架之一,它能利用简单的高级程序对大型数据集进行分布式存储和处理。本文将介绍Hadoop的核心概念,描述其体系架构,指导您如何开始使用Hadoop以及在Hadoop上编写和执行各种应用程序。 Hadoop是阿帕奇(Apache)软件基金会发布的一个开源项目,它可以安装在服务器集群上,通过服务器之间的通信和协同工作来存储和处理大型数据集。因为能够高效地处理大数据,Hadoop近几年获得了

优秀的个人博客,低调大师

Logtail从入门到精通(二):开启日志采集之旅

Logtail相关概念 为了更好的了解日志采集,这里我们首先对日志采集中遇到的基本概念进行简要的介绍。 概念介绍 项目: 项目(Project)是日志服务中的资源管理单元,用于资源隔离和控制。您可以通过项目来管理某一个应用的所有日志及相关的日志源。它管理着用户的所有日志库(Logstore),采集日志的机器配置等信息,同时它也是用户访问日志服务资源的入口。 日志库: 日志库(Logstore)是日志服务中日志数据的采集、存储和查询单元。每个日志库隶属于一个项目,且每个项目可以创建多个日志库。 Logtail客户端: Logtail是一款执行日志收集工作的Agent,一般安装在需要收集日志的服务器上,作为独立软件运行。 机器组: 一个机器组包含一或多台需要收集一类日志的机器。通过绑定一组Logtail配置到一个机器组,可以让日志服务根据同样的L

优秀的个人博客,低调大师

Spring Boot入门(6)前端接受后台传参

基础知识 利用Spring Boot来制作Web应用,就必定会涉及到前端与后台之间互相传递参数。在Spring Boot的MVC模型中,如果采用Thymeleaf来渲染视图,则前端页面怎么才能获得后台运行传递的参数呢? 我们介绍两种在Thymeleaf中前端接受后台传参的方法: Thymeleaf自带的方法 Thymeleaf提供的JavaScript接受后台参数方法 在Thymeleaf中,使用th:text=”${var}”或者th:text=”#{var}”可接受后台参数。如果使用Thymeleaf提供的JavaScript接受后台参数方法, 则需在script标签中加入th:inline=”javascript”, 同时使用变量时应为 [[$var]]。 采用JavaScript可以接受的后台参数类型有: Strings Numbers Booleans Arrays Collections Maps Beans (Java对象实现getter和setter方法) 一个例子 以上为理论知识介绍部分,读者看了可能不一定会具体使用。因此,一个简单的例子是必须的。在这个例子中,后台使用Map方法向前端传递String和Bean。项目的完整结构如下图: 我们只需创建红线框内的三个文件。首先是Bean文件,即User类, 代码如下: package com.hello.paramDemo.Controller; public class User { private int age; private String name; User(int age, String name){ this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 接着是Controller文件,EgController.java的代码如下: package com.hello.paramDemo.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Map; @Controller public class EgController { @RequestMapping(value="/params", method = RequestMethod.GET) /* 后台用Map方法向前端传递参数 * 传递的参数为message1: String, message2: String, user: User对象 */ public String passParam(Map <String, Object> map){ map.put("message1", "Hello, Spring Boot!"); map.put("message2", "Hello, Spring Boot!"); User user = new User(18, "Bruce"); map.put("user", user); return "result"; } } 最后是视图result.html,其代码如下: <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Passing Paraments</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script th:inline="javascript"> function ShowMessage(){ document.getElementById("message2").innerHTML = "Thymeleaf String by JS: " + [[${message2}]]; var user = /*[[${user}]]*/ null ; document.getElementById("user").innerHTML = "Thymeleaf Beans by JS: name ->"+ user.name +", age -> "+ user.age.toString(); } </script> </head> <body> <p th:text="${message1}">test</p> <p id="message2"></p> <p th:text="'name: ' + ${user.name} +', age: ' + ${user.age}"></p> <p id="user"></p> <button onclick="ShowMessage()">Show Message From Java</button> </body> </html> 在上述Thymtleaf渲染的HTML页面中,就用到了之前将的两种办法来接受后台传递过来的参数。在JavaScript部分,user变量被赋予后台传递的user类的值,就是JavaScript中的对象。 程序运行 启动上述Spring Boot项目,在浏览器中输入: http://localhost:8080/params, 可以看到页面如下: 这是用Thymeleaf自带的方法接受后台参数, 还未显示JavaScript接受的参数。如想显示JavaScript接受的参数,可以点击“Show Message From Java”按钮,页面如下: 本次分享到此结束,如有问题,可参考Thymeleaf的官方说明文档网址: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html . 当然,也欢迎大家交流~~

优秀的个人博客,低调大师

入门指南】使用阿里云Elasticsearch搭建ELK日志系统

1.搭建专用网络 1.1 登录专有网络管理控制台 阿里云Elasticsearch是搭建在专有网络上的,所以我们先开通阿里云专有网络,点击开通. 1.2 创建专有网络 点击创建专有网络 在专有网络名称和交换机上写好名字,后续在购买es和ecs时候对应需要。 参考链接:https://helpcdn.aliyun.com/document_detail/65430.html 2. 购买Elasticsearch服务 2.1 购买入口 2.2 购买服务 在订单页面上选择已经创建的专有网络并设置登录密码 购买页面的登录账号默认为“elastic”,密码可自行设置,与登录Kibana的账号密码是一致的。 2.3 控制台查看状态 成功购买之后进入阿里云控制台选择大数据(数加)->阿里云Elasticsearch 2.4 登录kibana控制台 从控制台点击实

优秀的个人博客,低调大师

Python入门(七)无序的字典和集合不容小觑

1.字典 访问字典里的参数 >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> dict1['music'] KeyError: 'music' 这里报错是因为,字典中并没有key值为 'music',为了避免 KeyError 发生,有两个办法: 先用 in 操作符判断一下 key 是否存在: >>> 'music' in dict1 False 用 get() 方法,在Key不存在的时候,返回None: >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> print (dict1.get('music')) None 修改字典 >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> dict1['singer']='kesha' >>> dict1['song']='Rainbow' >>> dict1 {'singer': 'kesha', 'sex': 'female', 'song': 'Rainbow'} 删除字典元素 >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> del dict1['sex'] #删除键是'sex'的条目 >>> dict1 {'singer': 'GEM', 'song': '查克靠近'} >>> dict1.clear() # 清空词典中所有条目 >>> dict1 {} >>> del dict1 # 删除词典 >>> dict1 NameError: name 'dict1' is not defined 字典的BIF 比较字典大小:operator() >>> import operator #首先要导入运算符模块 >>> operator.gt(dict1,dict2) #意思是greater than(大于) False >>> operator.ge(dict1,dict2) #意思是greater and equal(大于等于) True >>> operator.eq(dict1,dict2) #意思是equal(等于) True >>> operator.le(dict1,dict2) #意思是less and equal(小于等于) True >>> operator.lt(dict1,dict2) #意思是less than(小于) False 字典的内置方法 浅拷贝字典,注和直接赋值不同:copy() >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> dict2=dict1 >>> dict3=dict1.copy() >>> dict1['singer']='kesha' >>> dict1['song']='Rainbow' >>> dict1 #dict1改变 {'singer': 'kesha', 'sex': 'female', 'song': 'Rainbow'} >>> dict2 #直接赋值得到的dict2跟着改变 {'singer': 'kesha', 'sex': 'female', 'song': 'Rainbow'} >>> dict3 #浅拷贝得到的dict3保持不变 {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} 创建一个新字典,以序列seq中元素做字典的键,字典所有键对应的初始值为value:fromkeys(seq[, value]) >>> seq = ('singer', 'sex', 'song') >>> dict1 = dict.fromkeys(seq) >>> dict1 {'singer': None, 'sex': None, 'song': None} >>> dict2 = dict.fromkeys(seq,2) >>> dict2 {'singer': 2, 'sex': 2, 'song': 2} -以列表返回可遍历的(键, 值) 元组数组:items() >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> dict1.items() dict_items([('singer', 'GEM'), ('sex', 'female'), ('song', '查克靠近')]) 把字典dict2的键值对更新到dict里:update(dict2) >>> dict1= {'singer': 'GEM', 'sex': 'female'} >>> dict2= {'song': '查克靠近'} >>> dict1.update(dict2) >>> dict1 {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} 以列表返回字典中的所有值:values() >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> list(dict1.values()) ['GEM', 'female', '查克靠近'] 删除字典给定键 key 所对应的值,返回值为被删除的值:pop(key[,default]) >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> pop1=dict1.pop('singer') >>> pop1 'GEM' 随机返回并删除字典中的一对键和值(一般删除末尾对):popitem() >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> pop1=dict1.popitem() >>> pop1 ('song', '查克靠近') >>> dict1 {'singer': 'GEM', 'sex': 'female'} 任何情况下都可以使用此种方法吗? >>> dict2={} >>> pop2=dict2.popitem() KeyError: 'popitem(): dictionary is empty' 上例说明,如果字典已经为空,调用此方法,就发生Error。 2.集合 set的内部结构和dict很像,唯一区别是不存储value,也就是说当用花括号括起来一堆没有映射关系的元素时就创建了一个集合。 访问集合里的参数 和字典一样,我们可以先判断要访问的参数是否在集合内: >>> set1= {'酷狗音乐', '网易云音乐', '虾米音乐'} >>> 'QQ音乐' in set1 False 更新集合 用add()添加元素,注意如果添加的元素已经存在于set中,add()不会报错,但是不会加进去了。 >>> set1= {'酷狗音乐', '网易云音乐', '虾米音乐'} >>> set1.add('QQ音乐') >>> set1 {'QQ音乐', '酷狗音乐', '网易云音乐', '虾米音乐'} 用remove()删除元素,注意如果删除的元素不存在set中,会出现Error: >>> set1= {'酷狗音乐', '网易云音乐', '虾米音乐'} >>> set1.remove('QQ音乐') KeyError: 'QQ音乐' 集合的内置方法 以下方法应用都比较简单,而且很多前面都已经提到过,所以就不在一一举例。 END!

优秀的个人博客,低调大师

Python入门(三)变量类型及数据类型转换

变量 顾名思义,就是程序运行中值能改变的量,而且在变量使用之前,需要对其赋值。变量名的命名及使用规则: 可以包括字母、数字、下划线,但不能以数字开头; 字母区分大小写,即同一字母的大小写代表不同的变量; 尽可能根据变量数据特点命名,可提高程序的可读性; 变量名不要和Python的BIF重名,虽然Python中可以对BIF进行赋值,但是实际编程中很可能会遇到BUG,在编译器中BIF为紫色。 等号"="是赋值的意思,左边是变量名,右边是值。1) 单变量赋值 >>> year=2018 2)多变量赋值 >>> a = b = c = 1 >>> a, b, c = 1, 2.0, 'DJY' 数据类型 Python有五个标准的数据类型: numbers(数字):int,float,bool,complex str(字符串) list(列表) tuple(元组) dict(字典) set(集合) int Python可以处理任意大小的整数,例如: >>> -12345678*9876543 #输出结果 -121932619631154 计算机中常使用十六进制表示整数,例如:0xFFEC,0xAABB。 float 有小数点的数字就可以理解为float型数据,不区分单双精度,并且可以通过round()等函数对其精度进行控制,例如: >>> round(11.23456789,2) #输出结果 11.23 对于很大或者很小的数,我们通常采用科学计数法,把10用E代替,例如:1.23E6,2.04E-23。 bool 一个布尔值只有True、False(注意大小写)两种值; 布尔值可以进行not、and和or运算:not是非运算,把 True 变成 False,False 变成 True; and是与运算,值都为 True时,结果才为True;or是或运算,只要有一个值为 True,结果就是 True。 complex >>> (2+3j)*(4+6j) #输出结果 (-10+24j) >>> (1+2j).imag #输出结果 2.0 str 由数字、字母、下划线组成,表示方法有单引号,双引号,三引号(三单引号和三双引号)三种,例:'djy',"djy",''' djy''',"""djy""",注意Python中单字符也是字符串; list 是一种有序的集合,可以包含整数,浮点数,字符串,对象,可以随时添加和删除其中的元素。 普通列表 >>> player=['酷狗音乐','网易云音乐','QQ音乐','虾米音乐'] >>> type(player) <class 'list'> 混合列表 >>> music=[1996,'11:59','IF','人间失格',['华晨宇','丁可']] >>> type(music) <class 'list'> 空列表 >>> empty=[] >>> empty [] tuple tuple 和 list 非常类似,只是,tuple一旦创建完毕,就不能修改了。 普通元祖 >>> tuple1=1, #或者tuple1=(1, ) 注意“,”是关键 >>> type(tuple1) <class 'tuple'> 空元祖 >>> tuple1=() >>> tuple1 () dict dict可存放任意类型对象,但它是通过键和键值来存储,其中键不可变且不允许同一个键出现两次,值可以取任何数据类型。dict = {key1 : value1, key2 : value2 } >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> type(dict1) <class 'dict'> >>> dict2= dict(singer='GEM', sex= 'female', song='查克靠近') >>> dict2 {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> type(dict2) <class 'dict'> 另外,通过给键值赋值的方式创建字典时,如果键值存在则自动更新键值内容,如果不存在此键值将会自动在字典里添加此键值。 set set 和 list 类似,但是set中的元素不可重复,而且是无序的,这点和 dict 的 key很像。 >>> set1= {'酷狗音乐', '网易云音乐', '虾米音乐'} >>> type(set1) <class 'set'> 数据类型转换 将一个字符串或数字转换为整型:int(x[,base]) x---字符串或数字; base---进制数,默认十进制; >>> int() 0 >>> int(1) 1 >>> int(1.8) 1 >>> int('0xff',16) 255 将整数和字符串转换成浮点数:float(x)x--- 整数或字符串 >>> float() 0.0 >>> float(1) 1.0 >>> float('123') 123.0 将一个字符串或数转化为复数或创建一个复数,如果第一个参数为字符串,则无需设置第二个参数:complex([real[, imag]])real---int,float,str; imag---int,float; >>> complex() 0j >>> complex(1) (1+0j) >>> complex("1") (1+0j) >>> complex("1+2j") # 这个地方"+"号两边不能有空格,否则会报错 (1+2j) 将对象转化为字符串型:str(x)x---对象 >>> str1=100 >>> str(str1) '100' >>> dict1= {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> str(dict1) "{'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'}" 计算字符串中的有效Python表达式,并返回一个对象:eval(expression[, globals[, locals]])expression---表达式。 globals---变量作用域,全局命名空间,如果设置,则必须是一个字典对象。locals---变量作用域,局部命名空间,如果设置,则可是任何映射对象。 >>> x = 2 >>> eval("x + 4") 6 >>> eval('pow(2,2)') 4 将序列转换为元组:tuple( seq )seq---序列 >>> tuple((1,2,3)) #将tuple转化为tuple (1, 2, 3,) >>> tuple([1,2,3]) #将list转化为tuple (1, 2, 3) >>> tuple({1:2,3:4}) #将dict转化为tuple (1, 3) 将元组转换为列表:list( seq )seq---序列 >>> tuple1=(1,'djy') >>> list1=list(tuple1) >>> list1 [1, 'djy'] 转化为一个无序不重复元素集,还可计算交集、并集、差集的集合:set([iterable])iterable--- 可迭代对象 >>> set1='djy' >>> set(set1) {'d', 'y', 'j'} >>> set1='djy' >>> set2='fxw' >>> set(set1) & set(set2) #取交集 set() >>> set(set1) | set(set2) #取并集 {'w', 'y', 'j', 'f', 'd', 'x'} >>> set(set1) - set(set2) #取差集 {'d', 'y', 'j'} 创建一个字典:dict(kwarg)、dict(mapping, kwarg)、dict(iterable, **kwarg) **kwargs---关键字;mapping---元素的容器;iterable---可迭代对象; >>> dict(singer='GEM', sex='female', song='查克靠近') {'singer': 'GEM', 'sex': 'female', 'song': '查克靠近'} >>> dict(zip(['A', 'B', 'C'], ['a','b','c'])) # 映射函数 {'A': 'a', 'B': 'b', 'C': 'c'} >>> dict([('A','a'),('B','b'),('C','c')]) #可迭代对象 {'A': 'a', 'B': 'b', 'C': 'c'} 创建一个不可变集合:frozenset([iterable])iterable---可迭代的对象,比如列表、字典、元组等 >>> a = frozenset('fxwdjy') >>> a frozenset({'w', 'y', 'f', 'j', 'd', 'x'}) 将一个字符转换为它的十进制值:ord(c)c---字符 >>> ord('a') 97 将一个整数转换为一个八进制、十六进制字符串:oct(x)、hex(x)x---10进制整数 >>> oct(10) '0o12' >>> hex(10) '0xa'

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册