首页 文章 精选 留言 我的

精选列表

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

Spring Boot入门(13)自制音乐平台

经过笔者这几天的辛勤劳作(其实就是苦逼地码代码),一个新的网站已经上线啦!该网站是用Spring Boot工具写的,主要实现的功能如下: 根据歌曲名称和音乐平台搜索歌曲,并实现歌曲的在线播放; 歌曲的下载功能; 网页统计量功能; 开发历史介绍。 该网站的首页网址为: http://musicdownload.cfapps.io/index ,页面如下: 在输入框中输入“2002 Anne Marie”,音乐平台(platform)选择QQ,稍等片刻,就会跳转到歌曲播放页面,如下: 点击该页面中的“Download”按钮即可下载该歌曲,点击“RETURN”按钮即可返回到歌曲搜索页面。下载歌曲的页面如下: 点击搜索页面中的红色文字“Music Player”,即可查看该网站的开发历史,页面如下: 欢迎大家访问这个网站,也希望大家能够提出有用的建议(注:网站的功能还在不断完善中,具体的开发过程可参考: http://musicdownload.cfapps.io/dev)~~ 希望您能肯定我的工作,更重要的是,享受音乐带来的快乐哦~ 注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

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

Spring Boot入门(11)实现文件下载功能

在这篇博客中,我们将展示如何在Spring Boot中实现文件的下载功能。 还是遵循笔者写博客的一贯风格,简单又不失详细,实用又能让你学会。 本次建立的Spring Boot项目的主要功能为文件下载,而且这也是唯一功能,当然,作为例子,要尽可能简单,所以,功能简化为只下载E盘music_eg目录下的某一个文件。 该Spring Boot项目的名称为file_download,其具体结构如下: build.gradle文件的代码如下: buildscript { ext { springBootVersion = '2.0.3.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') } 我们只需要创建一个控制器(Controler)文件,即Controller目录下的File_Download.java,其完整目录如下: package com.example.file_download.Controller; import java.io.*; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class File_Download { //实现Spring Boot 的文件下载功能,映射网址为/download @RequestMapping("/download") public String downloadFile(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { // 获取指定目录下的第一个文件 File scFileDir = new File("E://music_eg"); File TrxFiles[] = scFileDir.listFiles(); System.out.println(TrxFiles[0]); String fileName = TrxFiles[0].getName(); //下载的文件名 // 如果文件名不为空,则进行下载 if (fileName != null) { //设置文件路径 String realPath = "E://music_eg/"; File file = new File(realPath, fileName); // 如果文件名存在,则进行下载 if (file.exists()) { // 配置文件下载 response.setHeader("content-type", "application/octet-stream"); response.setContentType("application/octet-stream"); // 下载文件能正常显示中文 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); // 实现文件下载 byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } System.out.println("Download the song successfully!"); } catch (Exception e) { System.out.println("Download the song failed!"); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } } return null; } } 这样我们就完成了Spring Boot的文件下载功能。什么?这样就搞定了?是的,就是这么简单,因为只实现了文件下载功能。具体的代码留给读者好好分析哦~~ 写完代码并不是我们的最终目的,我们还差最后一步,那就是测试!测试,真的相当重要啊~ 运行Spring Boot项目后,在浏览器中输入:http://localhost:8080/download , 你会发现什么?那就是你的浏览器已经开始下载E盘music_eg目录下的某一个文件啦(前提是E盘中存在music_eg目录,当然里面还得有文件,本例仅作为测试),如下图所示: 我们再去查看E盘music_eg目录,如下: So, 用Spring Boot实现文件下载功能搞定!欢迎大家交流哦~ 注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

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

Java多线程 -- wait() 和 notify() 使用入门

在前面讲解synchronize的文章中,有提到wait和notify,大概描述了它的使用,这里我将根据官方api详细的教你如何使用。 所属对象 wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态。 文档分析 我们找到Object类,下载它的文档,翻译每个方法的注释。 总结如下: wait() 和 notify() 必须由对象持有者去调用,有三种方式: 1️⃣执行该对象的synchronized实例方法 2️⃣执行synchronized代码块 3️⃣执行该类的synchronized静态方法 当想要调用wait( )进行线程等待时,必须要取得这个锁对象的控制权(对象监视器),一般是放到synchronized(obj)代码中。 在while循环里用wait操作性能更好(比if判断) 调用obj.wait( )释放了obj的锁,否则其他线程也无法获得obj的锁,也就无法在synchronized(obj){ obj.notify() } 代码段内唤醒A。 notify( )方法只会通知等待队列中的第一个相关线程(不会通知优先级比较高的线程) notifyAll( )通知所有等待该竞争资源的线程(也不会按照线程的优先级来执行) 如果是synchronized声明的方法,wait()操作后会施放synchronized锁,相反notify()触发后会重拿起synchronized锁。 如果当前线程不是当前对象所持有,则会报异常IllegalMonitorStateException 实例 1. 通过调用对象的wait和notify实现 /** 调用对象的 wait 和 notify 实例 * Created by Fant.J. */ public class Demo { private boolean flag = false; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public static void main(String[] args) { Demo demo = new Demo(); new Thread(new Runnable() { @Override public void run() { System.out.println("修改flag线程执行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } demo.setFlag(true); notify(); System.out.println("修改flag并释放锁成功"); } }).start(); new Thread(new Runnable() { @Override public void run() { while (demo.isFlag() != true){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("flag为true时线程执行"); } }).start(); } } 修改flag线程执行 Exception in thread "Thread-1" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:502) at com.thread.waitNotify.Demo$2.run(Demo.java:41) at java.lang.Thread.run(Thread.java:748) Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at com.thread.waitNotify.Demo$1.run(Demo.java:31) at java.lang.Thread.run(Thread.java:748) 从运行结果可以看出,它报错IllegalMonitorStateException,我们上面有给出报该异常的原因,是因为没有没有获取到对象的监视器控制权,我们new了两个线程,一个调用了wait 一个调用了notify,jvm认为wait是一个线程下的wait,notify是另一个线程下的notify,事实上,我们想实现的是针对Demo对象的锁的wait和notify,所以,我们需要调用Demo对象的wait和notify方法。 修改后的代码: /** 调用对象的 wait 和 notify 实例 * Created by Fant.J. */ public class Demo { private boolean flag = false; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public static void main(String[] args) { Demo demo = new Demo(); new Thread(new Runnable() { @Override public void run() { synchronized (demo) { System.out.println("修改flag线程执行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } demo.setFlag(true); demo.notify(); System.out.println("修改flag并释放锁成功"); } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (demo) { while (demo.isFlag() != true) { try { demo.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("flag为true时线程执行"); } } }).start(); } } 修改flag线程执行 修改flag并释放锁成功 flag为true时线程执行 修改了两处,一处是加了synchronized代码块,一处是添加了wait和notify的调用对象。 2. 通过synchronized修饰方法来实现 package com.thread.waitNotify_1; /** 通过synchronized方法实现 wait notify * Created by Fant.J. */ public class Demo2 { private volatile boolean flag = false; public synchronized boolean getFlag() { System.out.println(Thread.currentThread().getName()+"开始执行..."); if (this.flag != true){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"执行结束..."); return flag; } public synchronized void setFlag(boolean flag) { this.flag = flag; notify(); } public static void main(String[] args) { Demo2 demo2 = new Demo2(); Runnable target1 = new Runnable() { @Override public void run() { demo2.getFlag(); } }; Runnable target2 = new Runnable() { @Override public void run() { demo2.setFlag(true); } }; new Thread(target1).start(); new Thread(target1).start(); new Thread(target1).start(); new Thread(target1).start(); } } Thread-0开始执行... Thread-1开始执行... Thread-2开始执行... Thread-3开始执行... 为什么四个线程都执行了呢?synchronized不是锁定线程了吗?我在上面8点中也有说明,wait()操作后,会暂时释放synchronized的同步锁,等notify()触发后,又会重拾起该锁,保证线程同步。 然后我们条用target2来释放一个线程: new Thread(target1).start(); new Thread(target1).start(); new Thread(target1).start(); new Thread(target1).start(); new Thread(target2).start(); Thread-0开始执行... Thread-1开始执行... Thread-2开始执行... Thread-3开始执行... Thread-0执行结束... 可以看到只释放了一个线程,并且是第一个线程,如果有优先级,他也是释放第一个线程。 如果把notify改成notifyAll。 Thread-0开始执行... Thread-2开始执行... Thread-1开始执行... Thread-3开始执行... Thread-3执行结束... Thread-1执行结束... Thread-2执行结束... Thread-0执行结束... 如何证明,每次notify后会拿到synchronized锁呢,我在执行notify后添加一些时间戳捕获帮助我们查看 public synchronized void setFlag(boolean flag) { this.flag = flag; // notify(); notifyAll(); System.out.println("测试notify触发后会不会等2s"+System.currentTimeMillis()); try { Thread.sleep(2000); System.out.println("测试notify触发后会不会等2s"+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } Thread-0开始执行... Thread-1开始执行... Thread-2开始执行... Thread-3开始执行... 测试notify触发后会不会等2s1529817196847 测试notify触发后会不会等2s1529817198847 Thread-3执行结束... Thread-2执行结束... Thread-1执行结束... Thread-0执行结束... 可以看到的确是notify重拾了synchronized的同步锁,执行完该方法后才会释放锁。

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

React 入门实例 参考阮一峰博客

React 可以在浏览器运行,也可以在服务器运行。服务器的用法与浏览器差别不大。 1 hello world程序 **开发环境**visual studio code和谷歌浏览器(谷歌浏览器翻墙安装React Developer Tools)。 1.1 使用 React 开发新项目 前提安装npm工具,Node版本 >= 6。 在工作空间,执行以下命令: 1. npm install -g create-react-app 2. create-react-app my-app 3. cd my-app 4. npm start 1 2 3 4 然后打开http:// localhost:3000 /查看您的应用程序。 创建React App不处理后端逻辑或数据库; 它只是创建一个前端构建管道,所以你可以将它用于任何你想要的后端。 当您准备部署到生产环境时,运行 npm run build 1 将在build文件夹中创建应用程序的优化版本。将 src 子目录的 js 文件进行语法转换,转码后的文件全部放在 build 子目录。 结果 在当前文件夹内创建一个目录。my-app 在该目录内,它将生成初始项目结构并安装依赖项: my-app ├── README.md ├── node_modules ├── package.json ├── .gitignore ├── public │ └── favicon.ico │ └── index.html │ └── manifest.json └── src └── App.css └── App.js └── App.test.js └── index.css └── index.js └── logo.svg └── registerServiceWorker.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 没有配置或复杂的文件夹结构,只有构建应用程序所需的文件。 安装完成后,您可以打开项目文件夹,编辑目录、文件开发自己的项目(如下面: 修改APP.js)。 如果您更改了代码,该页面将自动重新加载。您将在控制台中看到构建错误和lint警告。 1) APP.js文件中编写Hello world程序 APP.js源码: import React, { Component } from 'react'; class App extends Component { render() { return ( <div className="App"> <h1 className="App-title">Hello World</h1> </div> ); } } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 注意:组件类只能包含一个顶层标签,否则也会报错 1.2 运行现有React项目/框架 一般readme文件中有说明,仔细阅读。运行现有源码包的基本步骤 1) 在项目的目录安装依赖 $ npm install 1 2) 将src子目录中的所有jsx文件转换为js文件。 $ npm run build 1 2 3) 启动http server $ node server.js 1 2 render() render()是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。 例如:index.js中将App标签,插入 root节点 ReactDOM.render( <App />, document.getElementById('root') ); 1 2 3 4 3 JSX 语法 HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写。demo2(项目index.js中修改import App from ‘./demo1’即可运行对应示例) import React, { Component } from 'react'; var names = ['Alice', 'Emily', 'Kate']; class App extends Component{ render(){ return( <div> { names.map(function (name, index) { return <div key={index}>Hello, {name}!</div> }) } </div> ) }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;遇到代码块(以 { 开头),就用 JavaScript 规则解析。 JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员。JSX 会把它的所有成员,添加到模板。demo03 import React, { Component } from 'react'; var arr = [ <h1>Hello world!</h1>, <h2>React is awesome</h2>, ]; class App extends Component{ render(){ return( <div> <div>{arr}</div> </div> ) }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 4 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。class关键字用于生成一个组件类。demo04 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <HelloMessage name="pengwei" />, </div> ) }; } class HelloMessage extends Component{ render() { return <h1>Hello {this.props.name}</h1>; } } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 上面代码中,变量 HelloMessage 就是一个组件类。模板插入 时,会自动生成 HelloMessage 的一个实例(下文的”组件”都指组件类的实例)。所有组件类都必须有自己的 render 方法,用于输出组件。 注意,组件类的第一个字母必须大写,否则会报错,比如HelloMessage不能写成helloMessage。另外,组件类只能包含一个顶层标签,否则也会报错。 组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。 注意,添加组件属性, class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。 5 this.props.children this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性,它表示组件的所有子节点。demo05 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <Parent> <span>hello</span> <span>world</span> </Parent> </div> ) }; } class Parent extends Component{ render(){ return( <ol> {React.Children.map(this.props.children,function(child) {return <li>{child}</li>;})} </ol> ) }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 注意, this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。 React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型 6 PropTypes和DefaultProps 组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。 - PropTypes属性,就是用来验证组件实例的属性是否符合要求。 - DefaultProps 方法可以用来设置组件属性的默认值。demo06 import React, { Component } from 'react'; import PropTypes from 'prop-types'; class App extends Component{ render(){ return( <div> <DefaultMessage /> </div> ); }; } class DefaultMessage extends Component{ render() { return (<h1>Hello {this.props.name}</h1>); } } DefaultMessage.propTypes = { name: PropTypes.string }; DefaultMessage.defaultProps ={ name : 'World' } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 7 获取真实的DOM节点 组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。 但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性demo07 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <TrueDom /> </div> ); }; } class TrueDom extends Component{ constructor(props) { super(props); // This binding is necessary to make `this` work in the callback this.handleClick = this.handleClick.bind(this); } handleClick() { this.refs.myTextInput.focus(); }; render() { return( <div> <input type="text" ref="myTextInput" /> <input type="button" value="Focus the text input" onClick={this.handleClick} /> </div> ); }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 需要注意的是,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会读取 this.refs.[refName] 属性。 8 this.state react将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI。 由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性demo08 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <LikeButton/> </div> ) }; } class LikeButton extends Component{ constructor(props) { super(props); this.state = {liked: false}; // This binding is necessary to make `this` work in the callback this.handleClick = this.handleClick.bind(this); } handleClick(event) { this.setState({liked: !this.state.liked}); }; render() { var text = this.state.liked ? 'like' : 'don\'t liked'; return ( <p onClick={this.handleClick}> You {text} this. Click to toggle. </p> ); }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 9 表单 用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取demo9 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <Input/> </div> ) }; } class Input extends Component{ constructor(props) { super(props); this.state = {value: 'Hello!'}; // This binding is necessary to make `this` work in the callback this.handleChange = this.handleChange.bind(this); }; handleChange(event) { this.setState({value: event.target.value}); }; render() { var value = this.state.value; return ( <div> <input type="text" value={value} onChange={this.handleChange} /> <p>{value}</p> </div> ); }; } export default App; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。 10 组件的生命周期 组件的生命周期分成三个状态: -Mounting:已插入真实 DOM -Updating:正在被重新渲染 -Unmounting:已移出真实 DOM React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数: -componentWillMount() -componentDidMount() -componentWillUpdate(object nextProps, object nextState) -componentDidUpdate(object prevProps, object prevState) -componentWillUnmount() 此外,React 还提供两种特殊状态的处理函数: -componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用 -shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用demo10 import React, { Component } from 'react'; class App extends Component{ render(){ return( <div> <ComponentLifestyle name = "pengwei"/> </div> ) }; } class ComponentLifestyle extends Component{ constructor(props) { super(props); this.state = {opacity: 1.0}; }; componentWillMount() { this.timer = setInterval(function () { var opacity = this.state.opacity; var flag = this.state.flag; if(opacity >= 1||opacity<=0) {flag = !flag;} if (flag){ opacity -= 0.02; } else{ opacity += 0.02; } this.setState({ opacity: opacity, flag: flag }); }.bind(this), 100); }; render() { return ( <div style={{opacity: this.state.opacity}} flag = {true}> Hello {this.props.name} </div> ); }; } export default App; 原文发布时间:2018年03月25日 本文来源CSDN博客如需转载请紧急联系作者

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

python web开发之——Flask入门教程

一、安装python2.7(略) 1、Mac下使用python2.7 2、Windows下安装python2.7 从官网下载 双击python2.7,然后选择安装路径,一顿下一步就可以了。 设置环境变量,把python的安装路径添加到PATH变量中。 还需设置一个环境变量,将python的Script目录也添加到PATH中,一定要设置,不然后面就不能正常安装flask了。想学习可以加Python学习(q-u-n )-227-435-450 即可获取,内附:开发工具和安装包,以及视频资料系统学习路线图 二、安装python虚拟环境 1、为什么要安装虚拟环境,举个栗子: 假设你现在要开发一个项目A,使用的Flask的版本是0.12.2,过几年你又要开发一个项目B,但是这时候Flask的版本已经升级到1.0了,但其实Flask0.12.2版本和Flask1.0版本是不兼容的,怎么办呢?你不可能把Flask0.12.2版本卸掉重新安装吧,这样的项目A不是都不能用了? 我们安装python虚拟环境就是为了解决兼容性问题。虚拟环境会把项目A的0.12.2版本当做一个盒子,把项目Bde 1.0版本当做另一个盒子,每个盒子里安装包都不会有任何影响,这样两个版本就可以共存。 所以我们这里解释一下: 因为python的框架跟新迭代的太快,有时需要在电脑上存在一个框架多个版本,这时候虚拟环境可以解决这个问题。 2、安装虚拟环境 通过以下命令安装虚拟环境:pip install virtualenv 开辟新的虚拟环境:virtualenv [virtualenv-name] 激活虚拟环境: 【类linux】:source [虚拟环境的目录]/bin/activate 【windows】:直接进入到虚拟环境的目录,然后执行activate 退出虚拟环境:deactivate 详细步骤(已经会的可以略过): 1、打开cmd,输入 pipinstallvirtualenv 1 2、创建一个目录,将你的虚拟环境安装在这个目录,你可以任意选择。 比如我选择我电脑的F盘,目录名为Virtualenv 3、进入到我们刚创建的Virtualenv目录 4、然后我们用命令创建一个盒子(虚拟环境的名字假设叫FlaskHello) 安装好以后,进入FlaskHello的Script目录,激活虚拟环境 activate 1 看到途中箭头所指的Flask-env,说明虚拟环境就激活了。 退出虚拟环境使用命令 deactivate 1 三、安装Flask 1、进入到我们安装的虚拟环境中,执行 pipinstallflask 1 2、安装完以后,我们进入python,到入flask,然后查看flask的版本 注意:version左右是两个下划线。 四、第一个Flask程序 使用pycharm来创建一个工程。(项目名最好不要用中文) 这里Interpreter要注意,如果你的环境是在windows下,需要选虚拟环境下的python,这里选择Add local 比如我的 如果你是linux环境,那就在虚拟环境的bin下寻找。 2、创建完成后,会看到已经有模板了,我们设置编码方式为utf8 我们来执行一下这个模板,可以看到结果给我们一个地址,我们将其复制到浏览器访问,可以看到页面上输出了“Hello World” 程序解释:

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

.NET轻量级ORM框架Dapper入门精通

一、课程介绍 本次分享课程包含两个部分《.NET轻量级ORM框架Dapper修炼手册》和《.NET轻量级ORM框架Dapper葵花宝典》,阿笨将带领大家一起领略轻量级ORM框架Dapper的魅力。 本次分享课程适合人群范围: 一、《.NET轻量级ORM框架Dapper修炼手册》适合人群如下: 1、我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错。 2、对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dapper的认识。 3、迫切想提高下ADO.NET实战技术以及Transact-SQL的编写能力。 二、《.NET轻量级ORM框架Dapper葵花宝典》适合人群如下: 1、我是一个新手,主要工作面向的是MySQL数据库,那么选择葵花宝典一定没错。 2、在Dapper修炼手册的基础上新增一个Dapper扩展库Dapper.SimpleCRUD。 3、如何运用Dapper操作Mysql数据库以及Dapper如何支持多数据库。 4、学习Dapper在实际项目常用的几种开发架构模式。(简单三层架构模式、工厂模式、Repository架构模式) 5、本次新增Dapper如何以优雅的方式使用事务。(强烈推荐) 二、课程知识点 2.1、《.NET轻量级ORM框架Dapper修炼手册》覆盖知识点 1、C# Linq To Xml技术。 2、Transact-SQL修炼手册。比如如何使用临时表、创建用户自定义表(TABLE)、XML数据字段、ROW_NUMBER分页函数、存储过程修炼手册(动态执行SQL、异常处理机制、事务处理机制)、C#如何获取存储过程的OUTPUT、RETURN参数值。 3、SQL Sever FOR XML技术(XML PATH、XML RAW、XML AUTO简单用法介绍)。 4、Transact-SQL关键字OPENXML操作内存中的 XML 文档。 5、Faker.Net仿照测试数据框架运用。 6、VS单元测试NuitTest运用。 7、Dapper在异步编程(Asyn Task)中的运用。 8、原生Dapper简单的CRUD(增删改查) 修炼手册。(强烈推荐) 9、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册。(强烈推荐) 10、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder修炼手册。(强烈推荐) 11、原生Dapper高级技巧修炼手册。(强烈推荐) 12、Dapper扩展库Dapper-Extensions修炼手册。(强烈推荐) 2.2、《.NET轻量级ORM框架Dapper葵花宝典》覆盖知识点 1、.NET程序员对MySQL数据库的基本认识和理解以及使用。 2、如何通过使用.NET轻量级ORM框架Dapper操作MySQL数据库。 3、Faker.Net仿照测试数据框架运用。 4、VS单元测试NuitTest运用。 5、Dapper在异步编程(Asyn Task)中的运用。 6、原生Dapper简单的CRUD(增删改查) 葵花宝典。(强烈推荐) 7、Dapper扩展库Dapper.SimpleCRUD的基本使用。(强烈推荐) 8、Dapper如何通过DynamicParameters动态拼接查询SQL葵花宝典。(强烈推荐) 9、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder葵花宝典。(强烈推荐) 10、原生Dapper高级技巧葵花宝典。(强烈推荐) 11、Dapper扩展库Dapper-Extensions葵花宝典。(强烈推荐) 三、在线源码观看地址 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET

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

Spring Boot入门(7)使用MyBatis操作MySQL

介绍 MyBatis 是一款优秀的、开源的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 这就表明,MyBatis是SQL映射框架(SQL mapping framework),和Hibernate工作原理并不相同,因为Hibernate是ORM 框架。 MyBatis社区已经为Spring Boot提供了starter依赖,因为我们可以在Spring Boot中愉快地使用MyBatis. 本次介绍将不使用MyBatis XML来执行数据库查询,而是使用基于注释的mappers(annotation-based mappers). 准备工作 因为本次演示的是如何在Spring Boot中使用MyBatis操作MySQL,进行数据库的增删改查。所以,我们需要对MySQL数据库做一些准备工作。具体说来,就说在MySQL的test数据库下新建表格person,其中的字段为id,name,age,city,id为自增长的主键。 use test create table person( id int primary key auto_increment, name varchar(20), age int, city varchar(20) ); 接着在 http://start.spring.io/ 中创建Spring Boot项目,加入Web, MyBatis, MySQL起始依赖,如下图: 项目结构 整个项目的结构如下图: 画红线的框内的文件是我们需要新增或修改的文件。 先是实体类Person.java,其代码如下: package com.hello.MyBatisDemo.domain; public class Person{ private Integer id; private String name; private Integer age; private String city; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } 接着是基于注释的mappers文件PersonMapper.java,其代码如下: package com.hello.MyBatisDemo.DAO; import com.hello.MyBatisDemo.domain.Person; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface PersonMapper { /** * 添加操作,返回新增元素的 ID * @param person */ @Insert("insert into person(id,name,age,city) values(#{id},#{name},#{age},#{city})") @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id") void insert(Person person); /** * 更新操作 * @param person * @return 受影响的行数 */ @Update("update person set name=#{name},age=#{age},city=#{city} where id=#{id}") Integer update(Person person); /** * 删除操作 * @param id * @return 受影响的行数 */ @Delete("delete from person where id=#{id}") Integer delete(@Param("id") Integer id); /** * 查询所有 * @return */ @Select("select id,name,age,city from person") List<Person> selectAll(); /** * 根据主键查询单个 * @param id * @return */ @Select("select id,name,age,city from person where id=#{id}") Person selectById(@Param("id") Integer id); } 下一步是控制文件PersonController.java,其代码如下: package com.hello.MyBatisDemo.Controller; import com.hello.MyBatisDemo.DAO.PersonMapper; import com.hello.MyBatisDemo.domain.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class PersonController { @Autowired private PersonMapper personMapper; @RequestMapping("/insert") public String insert(@RequestParam String name, @RequestParam String city, @RequestParam Integer age) { Person person = new Person(); person.setName(name); person.setAge(age); person.setCity(city); personMapper.insert(person); return "第"+person.getId()+"条记录插入成功!"; } @RequestMapping("/update") public String update(@RequestParam Integer id, @RequestParam String name, @RequestParam String city, @RequestParam Integer age) { Person person = new Person(); person.setId(id); person.setName(name); person.setAge(age); person.setCity(city); return personMapper.update(person)+"条记录更新成功!"; } @RequestMapping("/delete") public String delete(@RequestParam Integer id) { return personMapper.delete(id)+"条记录删除成功!"; } @RequestMapping("/selectById") public Person selectById(@RequestParam Integer id) { return personMapper.selectById(id); } @RequestMapping("/selectAll") public List<Person> selectAll() { return personMapper.selectAll(); } } 最后一步是整个项目的配置文件application.properies,主要是MySQL数据库的连接设置,其代码如下: spring.datasource.url=jdbc:mysql://localhost:33061/test?useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=147369 spring.datasource.driver-class-name=com.mysql.jdbc.Driver server.port=8100 整个项目的结构及代码介绍完毕。 运行及测试 启动Spring Boot项目,在浏览器中输入: http://localhost:8100/insert?name=bob&age=14&city=shanghai 即可插入一条新的记录。如此类似地插入以下三条记录: 在浏览器中输入: http://localhost:8100/update?id=2&name=tian&age=27&city=shanghai 即可更新id=2的记录 在浏览器中输入: http://localhost:8100/delete?id=3 即可删除id=3的记录。 在浏览器中输入: http://localhost:8100/selectById?id=2 即可查询id=2的记录。 在浏览器中输入: http://localhost:8100/selectAll 即可查询所有的记录。 本次分享到此结束,接下来还会继续分享更多的关于Spring Boot的内容,欢迎大家交流~~

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

深度学习入门:用MNIST完成Autoencoder(续)

其实通常情况下,Autoencoder做数据压缩,性能并不怎么样。以图片压缩为例,想要训练一个能和JPEG性能相提并论的自编码器非常困难,并且要达到这个性能,你还必须要把图片的类型限定在很小的一个范围内(例如JPEG不怎么行的某类图片)。自编码器依赖于数据的特性使得它在面对真实数据的压缩上并不可行,你只能在指定类型的数据上获得还可以的效果,但谁知道未来会有啥新需求?在实际应用中用的很少,2012年人们发现在卷积神经网络中使用自编码器做逐层预训练可以训练深度网络,但很快人们发现良好的初始化策略在训练深度网络上要比费劲的逐层预训练有效得多,2014年出现的Batch Normalization技术使得更深的网络也可以被有效训练,到了2015年底,通过使用残差学习(ResNet)我们基本上可以训练任意深度的神经网络。 变分自编码器(Var

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

Scrapy爬虫(8)scrapy-splash的入门

scrapy-splash的介绍 在前面的博客中,我们已经见识到了Scrapy的强大之处。但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取JavaScript生成的动态网页,只能爬取静态网页,而在现代的网络世界中,大部分网页都会采用JavaScript来丰富网页的功能。所以,这无疑Scrapy的遗憾之处。 那么,我们还能愉快地使用Scrapy来爬取动态网页吗?有没有什么补充的办法呢?答案依然是yes!答案就是,使用scrapy-splash模块! scrapy-splash模块主要使用了Splash. 所谓的Splash, 就是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。Splash的特点如下: 并行处理多个网页 得到HTML结果以及(或者)渲染成图片 关掉加载图片或使用 Adblock Plus规则使得渲染速度更快 使用JavaScript处理网页内容 使用Lua脚本 能在Splash-Jupyter Notebooks中开发Splash Lua scripts 能够获得具体的HAR格式的渲染信息 scrapy-splash的安装 由于Splash的上述特点,使得Splash和Scrapy两者的兼容性较好,抓取效率较高。 听了上面的介绍,有没有对scrapy-splash很心动呢?下面就介绍如何安装scrapy-splash,步骤如下: 1. 安装scrapy-splash模块 pip3 install scrapy-splash 2. scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker。不同系统的安装命令会不同,如笔者的CentOS7系统的安装方式为: sudo yum install docker 安装完docker后,可以输入命令‘docker -v’来验证docker是否安装成功。 3. 开启docker服务,拉取splash镜像(pull the image): sudo service docker start sudo dock pull scrapinghub/splash 运行结果如下: 4. 开启容器(start the container): sudo docker run -p 8050:8050 scrapinghub/splash 此时Splash以运行在本地服务器的端口8050(http).在浏览器中输入’localhost:8050’, 页面如下: 在这个网页中我们能够运行Lua scripts,这对我们在scrapy-splash中使用Lua scripts是非常有帮助的。以上就是我们安装scrapy-splash的全部。 scrapy-splash的实例 在安装完scrapy-splash之后,不趁机介绍一个实例,实在是说不过去的,我们将在此介绍一个简单的实例,那就是利用百度查询手机号码信息。比如,我们在百度输入框中输入手机号码‘159********’,然后查询,得到如下信息: 我们将利用scrapy-splash模拟以上操作并获取手机号码信息。 1. 创建scrapy项目phone 2. 配置settings.py文件,配置的内容如下: ROBOTSTXT_OBEY = False SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, } DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810 } SPLASH_URL = 'http://localhost:8050' DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 具体的配置说明可以参考: https://pypi.python.org/pypi/scrapy-splash . 3. 创建爬虫文件phoneSpider.py, 代码如下: # -*- coding: utf-8 -*- from scrapy import Spider, Request from scrapy_splash import SplashRequest # splash lua script script = """ function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(args.wait)) js = string.format("document.querySelector('#kw').value=%s;document.querySelector('#su').click()", args.phone) splash:evaljs(js) assert(splash:wait(args.wait)) return splash:html() end """ class phoneSpider(Spider): name = 'phone' allowed_domains = ['www.baidu.com'] url = 'https://www.baidu.com' # start request def start_requests(self): yield SplashRequest(self.url, callback=self.parse, endpoint='execute', args={'lua_source': script, 'phone':'159*******', 'wait': 5}) # parse the html content def parse(self, response): info = response.css('div.op_mobilephone_r.c-gap-bottom-small').xpath('span/text()').extract() print('='*40) print(''.join(info)) print('='*40) 4. 运行爬虫,scrapy crawl phone, 结果如下: 实例展示到此结束,欢迎大家访问这个项目的Github地址: https://github.com/percent4/phoneSpider .当然,有什么问题,也可以载下面留言评论哦~~

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

Android学习之——Binder学习入门

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/79533583 前言 已经不知道多久没有学习,没有写博客了。昨天看到一句“一个好的程序员,还是一名作家。” 感觉自己不应该一天老给自己找借口说工作太忙,没时间学习。废话不多说,下面进入今天的正题那就是大多数Android程序员为之头疼的东西——Binder。但是,Binder又是面试时大多数面试官会问的问题。关于Binder的资料网上有很多很多,但是,由于Binder代码本身就比较枯燥,很多资料都是长篇大论,看着看着就看不下去了。下面简单谈谈Binder。 一、什么是Binder? 关于“什么是Binder?”这个问题,从刚哥的《Android开发艺术与探索》第二章 IPC机制 2.3.3Binder中,简单总结如下: 1、Binder是一个类,实现了IBinder接口。(直观) 2、Binder是Android中一种跨进程通信的模式。(IPC) 3、Binder是一种虚拟物理物理设备,它的设备驱动是/dev/binder。(物理层) 4、Binder是链接ServiceManager链接各种,Manager(ActivityManager\WindowManager等)和ManagerService之间的桥梁。(Android Framework ) 5、Binder是一个客户端和服务端进行通信的媒介。(应用层) 可能这样直接说还是不太明白,我们从Android的整体架构来看(如下图所示,图片引用自:https://source.android.com),Binder 是处于 Android FrameWork跟Android System Services之间。 我们主要从图中也可以看出“Android系统是一种基于Binder的通信机制(个人观点,如果不对请指正)”。 二、Binder的应用场景 那么什么时候会用到Binder昵?那就是跨进程通信(IPC)时,如上图所示Android调用所有的Android System Service时都会用到Binder,主要包括AIDL和Messenger,说到这里还是不得不提一下操作系统中的基础知识:什么是进程?进程与线程有什么区别? 进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 区别:一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 什么是AIDL?怎么用? *AIDL:Android Interface definition Language 安卓接口定义语言 (1)作用:发布和调用远程服务,实现跨进程通信 (2)将服务的aidl放到对应的src文件夹中,工程的gen会产生对应的接口类 (3)通过bindservice方法绑定远程服务 (4)通过IBinder 获取到的对象,该对象既可以和我们的进程通信,又可以和远程进程通信,充当了中间通信的角色。 三、浅谈Binder的工作原理 关于Binder的工作原理的资料非常多,我目前看的也有些晕,不对的地方请大家指正,个人理解如下: 关于Binder的架构模式是C/S模式,主要有四个对象Client、Server、Service Manager、Binder Driver,从图中我们可以看出四个对象的关系有些类似于互联网:Clinet-客户端,Server-服务端,ServiceManager-DNS,Binder Driver-路由器。 “Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系如下图(引用自老罗的博客)所示: 从图中我们不难看出: 1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中。 2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server。 3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信。 4. Client和Server之间的进程间通信通过Binder驱动程序间接实现。 5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力。 总结 看了好几篇文章看的还是有些晕,下面用一张图来简单总结一下自己对Binder的认识,如有问题,请大家指正。 参考文献 1、《Android开发艺术与探索》 2、Android进程间通信(IPC)机制Binder简要介绍和学习计划 3、深入理解Binder 4、简单明了,彻底地理解Binder

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

Python3入门机器学习 - numpy篇

numpy是python的一个支持矩阵、向量运算的库,由于python自带的list不仅效率低,也不会将数组看作矩阵或者向量,因此在机器学习中,使用numpy来作为操作数组及矩阵的工具 numpy生成数组或矩阵 numpy.array([i for i in range(10)]) numpy.dtype numpy.zeros(10,dtype=int //该参数可选) numpy.zeros((3,5)) numpy.ones(shape=(3,5)) numpy.full(shape=(3,5),fill_value=66.0) numpy.arange(10) numpy.arange(0,1,0.2) arange函数生成步长相等的数列 numpy.linspace(0,20,10) linspace函数生成个数一定的数列 随机数 numpy.random.randomint(0,10) 生成[0,10)这个区间的一个随机整数 numpy.random.randomint(0,10,size=10) 十个随机整数 numpy.random.randonint(0,10,(4,5)) 4*5矩阵的随机整数 numpy.random.seed(123) 设置伪随机数种子,在每次random调用前使用相同的种子可得到相同的随机数序列 numpy.random.normal() 生成均值为0,方差为1的分布的随机浮点数 numpy.random.noraml(5,10,(3,5)) 均值为5,方差为10的3*5矩阵 矩阵属性 x=numpy.arange(10,(3,5)) x.ndim //x的维度 x.shape //x的各维度长度 x.size //x的总元素数量 使用X=x[:2,:2]获取的x的子矩阵,当修改X时同样会改变x的值,修改x也会改变X的值 因此我们如果我们想获得一个和x无关的x的子矩阵,需要使用X=x[:2,:2].copy() 使用y=x.reshape(5,3)可以将3*5的x矩阵改变为5*3的y矩阵,x的值不变 y=x.reshape(5,-1)可以自动帮我们计算出,要将x转换为5行,所需要的列数y依然变为5*3的矩阵 数据合并分割 numpy.concatenate([A,B],axis=1) numpy.vstack(A,B) numpy.hstack(A,B) numpy.split(A,[2],axis=1) numpy.vsplit(A,[2]) numpy.hsplit(A,[2]) 矩阵运算 矩阵间所有直接使用运算符的运算都只会进行相应元素间的运算 例如 因此如果我们想要进行正常的矩阵运算,需要调用numpy支持的函数,例如乘法 A.dot(B) numpy.linalg.inv(A) 求A矩阵的逆 numpy.linalg.pinv(A) 求A矩阵的伪逆矩阵 聚合运算 np.sum(A) np.sum(A,axis=0) 沿着维度为0的轴进行求和运算 np.prod(A) 对A矩阵求所有元素乘积 np.mean(A) 求均值 np.median(A) 求中位数 np.percentile(A,50) 求第五十个百分位点的数值 np.var(A) 求方差 np.std(A) 求标准差 索引与排序 np.argmin(A) 求A中最小值的索引值 np.argmax(A) np.random.shuffle(x) 对x进行乱序处理 np.argsort(x) 索引排序 np.partition(x,3) 以3为基准线排序 np.argpartition(x,3) Fancy Indexing numpy支持将数组作为索引来查询array里的值 查询的数组甚至可以是布尔数组 num.array的比较 该比较方法可以推广到所有比较符以及矩阵 np.any(判断条件) 只要变量中有一个元素满足判断条件,返回True np.all(判断条件) 只有所有变量元素满足判断条件,返回Ture np.sum(X%2==0,axis=1) 该命令查看矩阵X沿列方向有多少偶数 np.sum((x<3) & (x>7)) 计算x中大于3,小于7的元素个数,在该运算中,只使用了一个&符号,也就是说,这里并非条件运算&&,而是位运算&(与运算)

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

c#入门递归求平方和

2008-04-10 15:55 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("请输入最大数n"); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(sum(n)); } private static int sum(int n) { int nsum; if (n == 1) nsum = 1; else nsum = n * n + sum(n - 1); return nsum; } } } 本文转自悬魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/archive/2010/02/03/1662393.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册