能力说明:
了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。
能力说明:
基本的计算机知识与操作能力,具备Web基础知识,掌握Web的常见标准、常用浏览器的不同特性,掌握HTML与CSS的入门知识,可进行静态网页的制作与发布。
跨域访问问题Failed to load resource: net::ERR_CONNECTION_REFUSED Access toXMLHttpRequest at 'http://localhost:8080/user/login' from origin'http://localhost:9999' has been blocked by CORS policy: No'Access-Control-Allow-Origin' header is present on the requestedresource.添加 @CrossOriginswagger突然跳转登录页面最后原因是导入了security的包,导致权限安全拦截 注释后运行成功报错:Skipping MapperFactoryBean with name 'userMapper' and 'cn.mbz.parkingsystem.mapper.UserMapper' mapperInterface. Bean already defined with the same name!No MyBatis mapper was found in ‘[xx.mapper]‘ package. Please check your configuration.解决方案:在启动主文件里面把@MapperScan("com.tony.ssmmd.mapper")注释掉就可以了,只保留配置文件com.xxx.xxx.config.MyBatiesPlusConfiguration里面的@MapperScan("com.xxx.xxx.mapper")其实两个保留一个就可以了用户列表加载不出来Request failed with status code 500后端报错ERROR 18400 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause不能用data,将其改为params。
使用SharedPreferences保存键值对数据如果您有想要保存的相对较小键值对集合,则应使用 SharedPreferences API。SharedPreferences 对象指向包含键值对的文件,并提供读写这些键值对的简单方法。每个 SharedPreferences 文件均由框架进行管理,可以是私有文件,也可以是共享文件。注意:SharedPreferences API仅仅提供了读写键值对的功能,你不要和PreferenceAPI相混淆,他们不是一码事。后者可以帮助你创建一个设置用户配置的UI(尽管也会使用SharedPreferences来保存app的设置)AndroidManifest.xml <activity android:name=".SaveData"> <intent-filter> <action android:name="sp" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>savedata.xml <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:orientation="horizontal"> <EditText android:id="@+id/et_input" android:layout_width="287dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="30dp" android:layout_weight="1" android:textSize="20dp"></EditText> <Button android:id="@+id/btn_saveContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_weight="1" android:onClick="save" android:text="存入SHAREDPREFENCE" android:textColor="#090909" android:textSize="20dp" app:backgroundTint="#E3E2E2"></Button> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="30dp"> <TextView android:id="@+id/tv_result" android:layout_width="332dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="1" android:textSize="20dp"></TextView> <Button android:id="@+id/btn_showContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:textColor="#090909" android:text="从SHAREDPREFERENCE取出" app:backgroundTint="#E3E2E2" android:textSize="20dp"></Button> </LinearLayout> </LinearLayout> </LinearLayout> savedata获取共享偏好设置(Shared Preferences)的句柄(handle) 写入Shared Preferences从共享Preference文件中读取数据package com.example.myapplication4; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; public class SaveData extends AppCompatActivity implements View.OnClickListener { private EditText et_content; private TextView tv_content; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_savedata); findViewById(R.id.btn_saveContent).setOnClickListener(this); findViewById(R.id.btn_showContent).setOnClickListener(this); tv_content = (TextView) findViewById(R.id.tv_result); et_content = (EditText) findViewById(R.id.et_input); if(tv_content.getText().toString().trim().equals("")){ SharedPreferences sp = this.getSharedPreferences("data", MODE_PRIVATE); tv_content.setText(sp.getString("content", "")); et_content.setText(sp.getString("content", "")); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_saveContent: SharedPreferences sp = this.getSharedPreferences("data", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("content", et_content.getText().toString().trim()); editor.commit(); Toast.makeText(this, "存入成功", Toast.LENGTH_SHORT).show(); break; case R.id.btn_showContent: sp = this.getSharedPreferences("data", MODE_PRIVATE); tv_content.setText(sp.getString("content", "")); Toast.makeText(this, "取出成功", Toast.LENGTH_SHORT).show(); break; } } } 实验结果总结使用两种方法来获取SharedPreferences对象:getSharedPreferences() – 该方法的第一个参数为preferences文件名,该方法用于区分不同的若干preferences文件;getPreferences() – 如果你的activity只使用一个preferences文件,该方法不需要文件名。写入值:调用edit()来获取一个SharedPreferences.Editor对象,使用该editor对象的putXXX()方法来写入值,最后通过commit()方法,整体提交数据的修改。
@[toc]ModelScope开源模型社区对于刚刚接触机器学习的开发者来说,ModelScope开源模型社区是你不容错过的选择!ModelScope开源模型社区快速入门及环境安装在这里你不仅可以在线体验开源模型,下载数据集,还可以根据说明文档配置环境,手把手的教你如何本地开发环境安装。安装python环境。 支持python3,不支持python2,建议3.7版本及以上。推荐您使用Anaconda进行安装。安装深度学习框架。ModelScopeLibrary目前支持Tensorflow,Pytorch两大深度学习框架进行模型训练、推理。您可根据模型所需的框架选择适合的框架进行安装。安装ModelScope Library。提供两种安装方式,您可选择适合的方式进行安装。pip安装。ModelScope提供了根据不同领域的安装包,您可根据对应的模型选择所需的安装包。 使用源码安装。还有更加详细的安装指南!主要有两大功能,模型库和数据集。模型库模型分为两类,可在线体验和可训练。下载数据集可以查找你想要的数据集。例如我要分类豌豆,就要下载一些豌豆图片作为训练集这里有数据集的介绍,数据预览和下载数据集文件。如果有疑问可以到文档中心查找。达摩卡通化模型输入一张人物图像,实现端到端全图卡通化转换,生成二次元虚拟形象,返回卡通化后的结果图像。类似网上很火的人像动漫模型介绍详细的介绍了该模型的功能以及原理,并且指出使用的方式和范围。还有模型的训练集,推理过程,数据评估等等。这里我们体验一下在线!速度还是很快的,卡通化的程度也很高!人像这方面没什么问题,下面我们上传风景照片看一下风景照片也是很不错的,所以我觉得不仅仅可以用到人像上面,对于一些风景来说将其卡通化,也别有一种意境!下载模型文件快速入手由于配置本地环境有些麻烦,为了更快的体验产品,这里选择了使用ModelScope提供的远程环境,即使用Notebook进行开发,更加方便和快捷。选择免费版本即可。上传要抠图的图片粘贴示例代码import cv2 from PIL import Image from modelscope.outputs import OutputKeys from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks img_cartoon = pipeline(Tasks.image_portrait_stylization, 'damo/cv_unet_person-image-cartoon_compound-models') result = img_cartoon('/mnt/workspace/image_cartoon.png') cv2.imwrite('result.png', result[OutputKeys.OUTPUT_IMG]) im = Image.open('result.png') im.show()运行输出并展示卡通化的图片!达摩人像抠图人像抠图对输入含有人像的图像进行处理,无需任何额外输入,实现端到端人像抠图,输出四通道人像抠图结果。在线抠图这个效果惊艳到我了,我也学过一点PS但是抠成这样对我是很难的,连头发丝都能抠出来,拯救了不会抠图的我!效果非常好呀!本地抠图报错我调试了一会也没成功。总结:虽然有的模型有些不足,但总体来说模型的训练度很高,速度也很快,对于机器学习有很大的帮助,可以在上面找一些项目自己动手做做,很轻松就能实现一个项目。由于我比较喜欢计算机视觉方面,所以我介绍几个计算机视觉方面的,这里还有很多模型如果有你喜欢的大家可以去尝试尝试!计算机视觉单标签图像分类 通用图像分割 文字检测 人像美肤 风格迁移 图像翻译自然语言处理分词 情感分类 句子相似度 关系抽取 零样本分类 翻译语音语音识别 语音合成 语音唤醒 音频分类 语音降噪 回声消除多模态图像描述 视觉定位 文本生成图片 多模态表征 视觉问答 图文检索ModelScope开源模型社区
WCF和TCP消息通信练习客户端MainWindow.xaml主页面MainWindow.xaml.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Lab_5 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void StartWindow(string userName, int left, int top) { ChatCline w = new ChatCline(); w.Left = left; w.Top = top; w.UserName = userName; w.Owner = this; w.Closed += (sender, e) => this.Activate();//关闭子窗体时激活父窗体 w.Show(); } private void bt1_Click(object sender, RoutedEventArgs e) { StartWindow("用户1", 0, 0); StartWindow("用户2", 400, 300); } private void bt2_Click(object sender, RoutedEventArgs e) { ChatCline w = new ChatCline(); w.Owner = this; w.Closed += (sendObj, args) => this.Activate(); w.Show(); } } } ChatCline.xaml聊天界面ChatCline.xaml.csusing Lab_5.ServiceReference1; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Lab_5 { /// <summary> /// ChatCline.xaml 的交互逻辑 /// </summary> public partial class ChatCline : Window,IService1Callback { public ChatCline() { InitializeComponent(); this.Closing += ChatCline_Closing; box.Visibility = System.Windows.Visibility.Hidden; } private Service1Client client; public string UserName { get { return textbox.Text; } set { textbox.Text = value; } } private void ChatCline_Closing(object sender, CancelEventArgs e) { if (client != null) { client.Logout(UserName); client.Close(); } } private void AddMessage(string str) { TextBlock t = new TextBlock(); t.Text = str; listmessage.Items.Add(t); } public void InitUsersInfo(string UsersInfo) { if (UsersInfo.Length == 0) return; string[] users = UsersInfo.Split('、'); for (int i = 0; i < users.Length; i++) { listbox.Items.Add(users[i]); } } public void ShowLogin(string loginUserName) { if (loginUserName == UserName) { box.Visibility = System.Windows.Visibility.Visible; } listbox.Items.Add(loginUserName); } public void ShowLogout(string userName) { listbox.Items.Remove(userName); } public void ShowTalk(string userName, string message) { AddMessage(userName+"说: "+message); } private void login_Click(object sender, RoutedEventArgs e) { UserName = textbox.Text; InstanceContext context = new InstanceContext(this); client = new Service1Client(context); try { client.Login(textbox.Text); login.IsEnabled = false; } catch (Exception ex) { MessageBox.Show("与服务端连接失败:" + ex.Message); return; } } private void launch_Click(object sender, RoutedEventArgs e) { client.Talk(UserName, messagebox.Text); messagebox.Text = ""; } private void messagebox_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { client.Talk(UserName, messagebox.Text); messagebox.Text = ""; } } } } 服务端Users.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WcfServiceLibrary1 { class Users { public string UserName { get; set; } public readonly IService1Callback callback; public Users(string userName, IService1Callback callback) { this.UserName = userName; this.callback = callback; } } }CC.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WcfServiceLibrary1 { class CC { public static List<Users> Users { get; set; } static CC() { Users = new List<Users>(); } public static Users GetUser(string userName) { Users user = null; foreach (var v in Users) { if (v.UserName == userName) { user = v; break; } } return user; } } }IService1.csusing System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfServiceLibrary1 { [ServiceContract(Namespace = "IService", CallbackContract = typeof(IService1Callback))] // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 public interface IService1 { // TODO: 在此添加您的服务操作 [OperationContract(IsOneWay = true)] void Login(string userName); [OperationContract(IsOneWay = true)] void Logout(string userName); [OperationContract(IsOneWay = true)] void Talk(string userName, string message); } public interface IService1Callback { [OperationContract(IsOneWay = true)] void ShowLogin(string loginUserName); [OperationContract(IsOneWay = true)] void ShowLogout(string userName); [OperationContract(IsOneWay = true)] void ShowTalk(string userName, string message); [OperationContract(IsOneWay = true)] void InitUsersInfo(string UsersInfo); } }Service1.csusing System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfServiceLibrary1 { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。 public class Service1 : IService1 { public void Login(string userName) { OperationContext context = OperationContext.Current; IService1Callback callback = context.GetCallbackChannel<IService1Callback>(); Users newUser = new Users(userName, callback); string str = ""; for (int i = 0; i < CC.Users.Count; i++) { str += CC.Users[i].UserName + "、"; } newUser.callback.InitUsersInfo(str.TrimEnd('、')); CC.Users.Add(newUser); foreach (var user in CC.Users) { user.callback.ShowLogin(userName); } } public void Logout(string userName) { Users logoutUser = CC.GetUser(userName); CC.Users.Remove(logoutUser); logoutUser = null; foreach (var user in CC.Users) { user.callback.ShowLogout(userName); } } public void Talk(string userName, string message) { Users user = CC.GetUser(userName); foreach (var v in CC.Users) { v.callback.ShowTalk(userName, message); } } } }实验结果通过本次练习简单掌握了WCF和TCP消息通信,实现聊天
## 编写一个登录页面,使用Tab栏实现“账号登录”和“二维码登录”这两种方式的切换,并通过transition组件结合animate.css实现切换时的动画效果1.CSS样式编写自己想要的大小,颜色等```html#content{ width: 400px;; margin: 60px auto; } .title{ height: 50px; border-bottom: 1px solid #e1e7ec; text-align: center; } #content a{ text-decoration: none; color: black; font-size: 16px; background: #f1f1f1; padding: 5px 10px; margin: 0 10px; border-radius: 5px; } .form-input{ height: 46px; line-height: 46px; margin-top: 10px;; } input{ box-sizing: border-box; padding: 0 25px; background: #eef3f5; border-radius: 8px; width: 100%; height: 100%; border: 0; outline: 0; font-size: 14px; } #content .active{ background-color: #09f; color: #fff; } .primary-button{ background: linear-gradient(325deg,#4aa4ff,#1058fa); width: 100%; height: 42px; border-radius: 23px; border: 0; outline: none; color: #fff; letter-spacing: 10px; font-weight: 500; font-size: 16px; cursor: pointer; margin-top: 30px; } .pic{ width: 200px; height: 200px; margin: 0 auto; } .pic img{ width: 100%; height: 100%; }```2.页面结构```html<!-- 定义登录组件 --> <template id="example1"> <div> <!-- 唯一的根容器 --> <div class="form-input"> <input type="text" name="user" placeholder="请输入手机号/邮箱" class="form-input"> </div> <div class="form-input"> <input type="password" name="psd" placeholder="请输入密码" class="form-input"> </div> <button type="button" class="primary-button"><span>登录</span></button> </div> </template> <!-- 二维码登录 --> <template id="example2"> <div class="pic"> <img src="./erweima.png"> </div> </template> <div id="content"> <div class="title"> <a href="javascript:;" @click="compontentName = 'example1',cur=0" :class="{active:cur == 0}">账号登录</a> <a href="javascript:;" @click="compontentName = 'example2',cur=1" :class="{active:cur == 1}">二维码登录</a> </div> <transition enter-active-class="animated bounceInDown"> <component :is="compontentName"></component> </transition> </div>```3.Javascript```html Vue.component('example1',{template:'#example1'}) Vue.component('example2',{template:'#example2'}) var vm = new Vue({ el: '#content', data: { compontentName :'example1', cur:0 } });```全代码:```html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录</title> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css"><style> #content{ width: 400px;; margin: 60px auto; } .title{ height: 50px; border-bottom: 1px solid #e1e7ec; text-align: center; } #content a{ text-decoration: none; color: black; font-size: 16px; background: #f1f1f1; padding: 5px 10px; margin: 0 10px; border-radius: 5px; } .form-input{ height: 46px; line-height: 46px; margin-top: 10px;; } input{ box-sizing: border-box; padding: 0 25px; background: #eef3f5; border-radius: 8px; width: 100%; height: 100%; border: 0; outline: 0; font-size: 14px; } #content .active{ background-color: #09f; color: #fff; } .primary-button{ background: linear-gradient(325deg,#4aa4ff,#1058fa); width: 100%; height: 42px; border-radius: 23px; border: 0; outline: none; color: #fff; letter-spacing: 10px; font-weight: 500; font-size: 16px; cursor: pointer; margin-top: 30px; } .pic{ width: 200px; height: 200px; margin: 0 auto; } .pic img{ width: 100%; height: 100%; }</style></head><body> <!-- 定义登录组件 --> <template id="example1"> <div> <!-- 唯一的根容器 --> <div class="form-input"> <input type="text" name="user" placeholder="请输入手机号/邮箱" class="form-input"> </div> <div class="form-input"> <input type="password" name="psd" placeholder="请输入密码" class="form-input"> </div> <button type="button" class="primary-button"><span>登录</span></button> </div> </template> <!-- 二维码登录 --> <template id="example2"> <div class="pic"> <img src="./erweima.png"> </div> </template> <div id="content"> <div class="title"> <a href="javascript:;" @click="compontentName = 'example1',cur=0" :class="{active:cur == 0}">账号登录</a> <a href="javascript:;" @click="compontentName = 'example2',cur=1" :class="{active:cur == 1}">二维码登录</a> </div> <transition enter-active-class="animated bounceInDown"> <component :is="compontentName"></component> </transition> </div> <script> Vue.component('example1',{template:'#example1'}) Vue.component('example2',{template:'#example2'}) var vm = new Vue({ el: '#content', data: { compontentName :'example1', cur:0 } }); </script> </body></html>```
### 一、案例描述链接1、 考核知识点创建vue实例和对v-model内置指令的使用2、 练习目标创建vue实例。掌握v-model内置指令的使用。3、 需求分析用户输入的两个数据,得到其大小返回比较结果。4、 案例分析1) 效果如图所示。```html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>比较大小</title> <style> .compare{ margin: 0 auto; width: 500px; } ul{ padding: 0; } ul li { list-style: none; margin-top: 0px; } .result{ font-size: 30px; } </style> <script src="vue.js"></script></head><body> <div id="app"> <!-- 定义页面结构 --> <div class="compare"> <ul> <li>数据1:<input type="text" v-model="num1"></li> <li>数据2:<input type="text" v-model="num2"></li> <li><input type="button" value="比较" @click='compare()'></li> </ul> <div class="result">{{result}}</div> </div> </div> <script> var vm = new Vue({ el: '#app', // 定义初始数据 data: { num1: '', num2: '', result: '' }, // 定义事件处理函数compare methods: { compare() { if (!this.num1 || !this.num2) { this.result = '输入的数不能为空' } else { this.result = parseInt(this.num1) == parseInt(this.num2) ? '两个数相等' : parseInt(this.num1) > parseInt(this.num2) ? '数据1大于数据2' : '数据2大于数据1' } } } }) </script> </body></html>```点个赞!### 二、案例描述1、 考核知识点2、 创建vue实例和对v-model内置指令的使用3、 练习目标创建vue实例。掌握v-model内置指令的使用。4、 需求分析用户通过选择计算方法和数据输入,得到计算结果。5、 案例分析1) 效果如图所示。```html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>计算器</title> <script src="vue.js"></script> <style> .result{ font-size: 30px; } </style></head><body> <div id="app"> <!-- 定义页面结构 --> <div class="calc"> <input type="radio" value="1" v-model="fuhao"/>加法 <input type="radio" value="2" v-model="fuhao"/>减法 <input type="radio" value="3" v-model="fuhao"/>乘法 <input type="radio" value="4" v-model="fuhao"/>除法 <ul> <li> 数据1:<input type="text" v-model="num1"> </li> <li> 数据2:<input type="text" v-model="num2"> </li> <li> <input type="button" value="计算" @click='calc()'> </li> </ul> <div class="result">结果:{{result}}</div> </div> </div> <script> var vm = new Vue({ el: '#app', // 定义初始数据 data: { fuhao: '1', num1: '', num2: '', result: '' }, // 定义事件处理函数Calc methods: { calc() { if (!this.num1 || !this.num2) { this.result = '输入的数不能为空' } else { if (this.fuhao == 1) { this.result = parseInt(this.num1) + parseInt(this.num2) } if (this.fuhao == 2) { this.result = parseInt(this.num1) - parseInt(this.num2) } if (this.fuhao == 3) { this.result = parseInt(this.num1) * parseInt(this.num2) } if (this.fuhao == 4) { this.result = parseInt(this.num1) / parseInt(this.num2) } } } } }) </script> </body></html>```有用的话点个赞吧!
## 请设计下面的三种计算器的UI: 1.简单的计算器 2.科学计算器 3.程序计算器不用实现具体功能,只需设计界面即可!### 为了更好的在三个界面之间跳转,添加一个主界面。#### activity_main.xml线性布局中添加4个按钮```xml<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="431dp" android:layout_height="669dp" android:orientation="vertical" tools:ignore="MissingConstraints" tools:layout_editor_absoluteX="-4dp" tools:layout_editor_absoluteY="57dp"> <Button android:id="@+id/button21" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="简单计算器" /> <Button android:id="@+id/button22" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="科学计算器" /> <Button android:id="@+id/button23" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="程序计算器" /> <Button android:id="@+id/button24" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="退出" /> </LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>```#### 界面效果:### 简单计算器:#### chengxujishuanqi.xml```xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="7"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center|right" android:text="0" android:textSize="50sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_weight="1" android:weightSum="4"> <Button android:id="@+id/button1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="退格" android:textSize="30sp" /> <Button android:id="@+id/button2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="清除" android:textSize="30sp" /> <Button android:id="@+id/button3" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="±" android:textSize="40sp" /> <Button android:id="@+id/button4" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="+" android:textSize="40sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/button5" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="7" android:textSize="40sp" /> <Button android:id="@+id/button6" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="8" android:textSize="40sp" /> <Button android:id="@+id/button7" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="9" android:textSize="40sp" /> <Button android:id="@+id/button8" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="—" android:textSize="40sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/button9" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="4" android:textSize="40sp"/> <Button android:id="@+id/button10" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="5" android:textSize="40sp"/> <Button android:id="@+id/button11" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="6" android:textSize="40sp"/> <Button android:id="@+id/button12" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="*" android:textSize="40sp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/button13" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="1" android:textSize="40sp"/> <Button android:id="@+id/button14" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="2" android:textSize="40sp"/> <Button android:id="@+id/button15" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="3" android:textSize="40sp"/> <Button android:id="@+id/button16" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="/" android:textSize="40sp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/button17" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="0" android:textSize="40sp"/> <Button android:id="@+id/button18" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="." android:textSize="40sp"/> <Button android:id="@+id/button19" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="1/x" android:textSize="30sp"/> <Button android:id="@+id/button20" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="=" android:textSize="40sp"/> </LinearLayout></LinearLayout>```#### 界面效果:### 科学计算器:#### kexuejishuanqi.xml```xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center|right" android:text="0" android:textSize="50sp"/> <TableLayout android:layout_width="match_parent" android:layout_height="21dp" android:layout_margin="10dp" android:padding="0dp"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="角度" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="弧度" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="梯度" android:textSize="15dp" /> </RadioGroup> </TableRow> </TableLayout> <TableLayout android:layout_width="match_parent" android:layout_height="215dp"> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="SIN" /> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="COS" /> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="TAN" /> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="COT"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ASIN"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ACOS"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ATAN"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ACOT"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="SINH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="COSH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="TANH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="COTH"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ASINH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ACOSH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ATANH"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="ACOTH"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="LN"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="LOG10"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="N!"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="X^Y"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="E^X"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="π"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="("></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text=")"></Button> </TableRow> </TableLayout> <TableLayout android:layout_width="match_parent" android:layout_height="186dp"> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="退格"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="清除"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="±"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="+"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="7"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="8"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="9"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="-"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="4"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="5"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="6"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="*"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="1"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="2"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="3"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="/"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="0"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="."></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="1/X"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="="></Button> </TableRow> </TableLayout> </LinearLayout></LinearLayout>```#### 界面效果:### 程序计算器:#### chengxujishuanqi.xml```xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center|right" android:text="0" android:textSize="50sp" /> <TableLayout android:layout_width="match_parent" android:layout_height="21dp" android:layout_margin="10dp" android:padding="0dp"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <RadioButton android:layout_width="76dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="十六进制" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="二进制" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="八进制" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="十进制" android:textSize="15dp" /> </RadioGroup> </TableRow> </TableLayout> <TableLayout android:layout_width="match_parent" android:layout_height="21dp" android:layout_margin="10dp" android:padding="0dp"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="八字节" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="四字节" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="二字节" android:textSize="15dp" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="单字节" android:textSize="15dp" /> </RadioGroup> </TableRow> </TableLayout> <GridLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:columnCount="4" android:orientation="horizontal" android:rowCount="3"> <Button android:layout_width="102dp" android:layout_height="match_parent" android:text="NOT" android:textColor="#FBF9F9" /> <Button android:layout_width="103dp" android:layout_height="match_parent" android:text="AND" /> <Button android:layout_width="104dp" android:layout_height="match_parent" android:text="OR" /> <Button android:layout_width="99dp" android:layout_height="match_parent" android:text="XOR" /> <Button android:layout_width="104dp" android:layout_height="match_parent" android:text="循环左移" /> <Button android:layout_width="104dp" android:layout_height="match_parent" android:text="循环右移" /> <Button android:layout_width="104dp" android:layout_height="match_parent" android:text="左移" /> <Button android:layout_width="102dp" android:layout_height="match_parent" android:text="MOD" /> <Button android:layout_columnSpan="2" android:layout_gravity="fill" android:text="无符号右移" /> <Button android:layout_width="wrap_content" android:layout_columnSpan="2" android:layout_gravity="fill" android:text="有符号右移" /> </GridLayout> <TableLayout android:layout_width="match_parent" android:layout_height="212dp"> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="退格"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="清除"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="9"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="±"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="6"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="7"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="8"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="+"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="3"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="4"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="5"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="+"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="0"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="1"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="2"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="/"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="A"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="B"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="C"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="D"></Button> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="487dp" android:layout_weight="1" android:padding="0dp"> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="E"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="F"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="G"></Button> <Button android:layout_height="match_parent" android:layout_weight="1" android:text="="></Button> </TableRow> </TableLayout> </LinearLayout></LinearLayout>```#### 界面效果:### 主界面和其他界面的交互点击对应的按钮,跳转相应的界面!#### MainActivity```javapackage com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn1=(Button) findViewById(R.id.button21); Button btn2=(Button) findViewById(R.id.button22); Button btn3=(Button) findViewById(R.id.button23); Button btn4=(Button) findViewById(R.id.button24); btn1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View View){ setContentView(R.layout.jiandanjishuanqi); } }); btn2.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View View){ setContentView(R.layout.kexuejishuanqi); } }); btn3.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View View){ setContentView(R.layout.chengxujishuanqi); } }); btn4.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View View){ System.exit(0); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event){ if(keyCode==KeyEvent.KEYCODE_BACK){ Intent intent=new Intent(this,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } return true; }}```### 总结:安卓实验作业,刚接触能力有限就做了个大概,可以根据自己的需求添加主题,样式,颜色!
实验4:线程管理练习1、通过本实验,熟悉和掌握Thread类、ThreadPool类以及WPF中多线程的使用。2、复习C#中lambda表达式和委托1、创建一个WPF应用程序项目2、将App.xaml中的Application.Resources节内容改为3、修改MainWindow.xaml及代码隐藏类MainWindow.xamlMainWindow.xaml.cs主要内容using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { Button oldButton = new Button(); public MainWindow() { InitializeComponent(); } private void button_Click(object sender, RoutedEventArgs e) { Button btn = e.Source as Button; btn.Foreground = Brushes.Black; oldButton.Foreground = Brushes.Black; oldButton = btn; frame1.Source = new Uri(btn.Tag.ToString(), UriKind.Relative); } } } Page2.xamlPage2.xaml.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp1.Examples { /// <summary> /// Page2.xaml 的交互逻辑 /// </summary> public partial class Page2 : Page { public Page2() { InitializeComponent(); Helps.ChangeState(btnStart, true, btnStop, false); } private void btnStop_Click(object sender, RoutedEventArgs e) { MyClass.IsSTop = true; Helps.ChangeState(btnStart, true, btnStop, false); } private void btnStart_Click(object sender, RoutedEventArgs e) { Helps.ChangeState(btnStart, false, btnStop, true); MyClass.IsSTop = false; textBlock1.Text = ""; MyClass c = new MyClass(textBlock1); MyData state = new MyData { Message = "a", Info = "\n线程1已终止" }; Thread thread1 = new Thread(c.MyMethod); thread1.IsBackground = true; thread1.Start(state); state = new MyData { Message = "b", Info = "\n线程2已终止" }; Thread thread2 = new Thread(c.MyMethod); thread2.IsBackground = true; thread2.Start(state); state = new MyData { Message = "c", Info = "\n线程3已终止" }; ThreadPool.QueueUserWorkItem(new WaitCallback(c.MyMethod), state); state = new MyData { Message = "d", Info = "\n线程4已终止" }; ThreadPool.QueueUserWorkItem(new WaitCallback(c.MyMethod), state); } } public class MyClass { public static volatile bool IsSTop; TextBlock textBlock1; public MyClass(TextBlock textBlock1) { this.textBlock1 = textBlock1; } public void MyMethod(object obj) { MyData state = obj as MyData; while (IsSTop==false) { AddMessage(state.Message); Thread.Sleep(1000); } AddMessage(state.Info); } private void AddMessage(string s) { textBlock1.Dispatcher.Invoke(() => { textBlock1.Text += s; }); } } public class MyData { public string Info { get; set; } public string Message { get; set; } } } 新建Helps类using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; namespace WpfApp1.Examples { class Helps { public static void ChangeState(Button btnStart,bool isStart,Button btnStop,bool isStop) { btnStart.IsEnabled = isStart; btnStop.IsEnabled = isStop; } } }运行结果在实验3的基础上实现了实验4通过本实验,即熟悉和掌握了线程管理Thread类、线程池ThreadPool类以及WPF中多线程的使用,又复习C#中lambda表达式和委托。
实验2:IP地址转换和域名解析练习1.通过本实验,复习本教材各章例子里的前端主界面和子页面的实现。2、通过本实验,熟悉和掌握IPAddress类、IPEndPoint类、IPHostEntry类、DNS类的使用。1、创建一个WPF应用程序项目2、将App.xaml中的Application.Resources节内容改为3、修改MainWindow.xaml及代码隐藏类MainWindow.xaml MainWindow.xaml.cs主要内容4、用鼠标右键单击项目,选择【添加】-【新建文件夹】命令,在项目中添加一个名为Examples的文件夹。5、用鼠标右键单击Examples文件夹,选择【添加】-【页】命令,在该文件夹下添加一个名为Page1.xaml的页。之后再按同样方法添加页Page2.xaml和Page3.xaml。6、修改Page1.xaml的核心代码Page1.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Net; using System.Net.Sockets; namespace 实验1_WPF练习.Examples { /// <summary> /// Page1.xaml 的交互逻辑 /// </summary> public partial class Page1 : Page { public Page1() { InitializeComponent(); } private void btn_Click(object sender, RoutedEventArgs e) { StringBuilder sb = new StringBuilder(); sb.AppendLine("获取www.cctv.com的所有IP地址:"); try { IPAddress[] ips = Dns.GetHostAddresses("www.cctv.com"); foreach (IPAddress ip in ips) { sb.AppendLine(ip.ToString()); } } catch (Exception ex) { MessageBox.Show(ex.Message, "获取失败"); } string hostName = Dns.GetHostName(); sb.AppendLine("获取本机所有IP地址:"); IPHostEntry me = Dns.GetHostEntry(hostName); foreach (IPAddress ip in me.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { sb.AppendLine("IPv4:" + ip.ToString()); } else if (ip.AddressFamily == AddressFamily.InterNetworkV6) { sb.AppendLine("IPv6:" + ip.ToString()); } else { sb.AppendLine("其他:" + ip.ToString()); } } IPAddress localip = IPAddress.Parse("::1"); //IPv6回路测试地址 Output(sb, localip); IPAddress localip1 = IPAddress.Parse("127.0.0.1");//IPv4回路测试地址 Output(sb, localip1); textBlock1.Text = sb.ToString(); } private static void Output(StringBuilder sb, IPAddress localip) { IPEndPoint iep = new IPEndPoint(localip, 80); if (localip.AddressFamily == AddressFamily.InterNetworkV6) { sb.Append("IPv6端点: " + iep.ToString()); } else { sb.Append("IPv4端点: " + iep.ToString()); } sb.Append(",端口 " + iep.Port); sb.Append(",地址 " + iep.Address); sb.AppendLine(",地址族 " + iep.AddressFamily); } } }结果
实验一:WPF练习1、创建一个WPF应用程序项目2、将App.xaml中的Application.Resources节内容改为3、修改MainWindow.xaml及代码隐藏类MainWindow.xaml MainWindow.xaml.cs主要内容using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace 实验1_WPF练习 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { Button oldButton = new Button(); public MainWindow() { InitializeComponent(); } private void button_Click(object sender, RoutedEventArgs e) { Button btn = e.Source as Button; btn.Foreground = Brushes.Black; oldButton.Foreground = Brushes.Black; oldButton = btn; frame1.Source = new Uri(btn.Tag.ToString(), UriKind.Relative); } } } 4、用鼠标右键单击项目,选择【添加】-【新建文件夹】命令,在项目中添加一个名为Examples的文件夹。5、用鼠标右键单击Examples文件夹,选择【添加】-【页】命令,在该文件夹下添加一个名为Page1.xaml的页。之后再按同样方法添加页Page2.xaml和Page3.xaml。6、修改Page1.xaml的核心代码实验结果我通过本次实验,复习了上学期C#WPF的核心知识点,发现了自己的不足和知识的欠缺,更加熟悉和掌握本教材各章例子里的前端主界面和子页面的实现,对后面的学习有很大的帮助。
完全数如果一个正整数等于除它本身之外其他所有除数之和,就称之为完全数。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { class Program { static void Main(string[] args) { for(int i = 1; i < 1000; i++) { int sum = 0; for(int j = 1; j < i; j++) { if (i % j == 0) { sum += j; } } if (sum == i) { Console.WriteLine(i); } } Console.ReadKey(); } } } 结果以前以内的完全数 6 28 496输出所有水仙花数水仙花数是三位数的数,其各位数字的立方和等于该数的本身代码using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp4 { class Program { static void Main(string[] args) { int a, b, c; for(int i = 100; i < 1000; i++) { a = i / 100; b = i / 10 %10; c = i % 10; if (a * a * a + b * b * b + c * c * c == i) { Console.WriteLine(i); } } Console.ReadKey(); } } }结果水仙花数为 153 370 371 407类的使用代码using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp6 { class Student { public string name; public string sex; public int age; public Student(string name, string sex) { } public Student(string name, string sex,int age) { this.name = name; this.sex = sex; this.age = age; } public void Inderduce() { Console.WriteLine("我叫"+this.name+"我是一个"+this.sex+"孩,我今年"+this.age+"岁"); } } class Program { static void Main(string[] args) { Student s1 = new Student("小华","男",20); Student s2 = new Student("小花","女",18); s1.Inderduce(); s2.Inderduce(); Console.ReadKey(); } } } 输出结果
正序、逆序输入用空格分隔的五个整数,分别输出正序、逆序、平均值和最大值。首先输入整数将长度为5,即可以输入五个整数,并用空格隔开 int[] myArray = new int[5]; string[] str = Console.ReadLine().Split(' ');输出正序Array.Sort(myArray); Console.Write("正序:"); for (int i = 0; i < 5; i++) { Console.Write(myArray[i]); if (i != 4) Console.Write(","); sum += myArray[i]; }输出逆序 Array.Reverse(myArray); Console.Write("逆序:"); for (int i = 0; i < 5; i++) { Console.Write(myArray[i]); if (i != 4) Console.Write(","); }输出平均数double sum = 0; double average; for (int i = 0; i < 5; i++) { sum += myArray[i]; } average = sum / 5; string strAverage = average.ToString("0.0"); 输出最大值int max; Array.Sort(myArray); max = myArray[4];代码using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.WriteLine("请输入用空格分隔的5个整数:"); int[] myArray = new int[5]; string[] str = Console.ReadLine().Split(' '); try { for (int i = 0; i < 5; i++) { myArray[i] = int.Parse(str[i]); } } catch { Console.WriteLine("输入错误!"); return; } double sum = 0; double average; int max; Array.Sort(myArray); Console.Write("正序:"); for (int i = 0; i < 5; i++) { Console.Write(myArray[i]); if (i != 4) Console.Write(","); sum += myArray[i]; } max = myArray[4]; average = sum / 5; string strAverage = average.ToString("0.0"); Console.WriteLine(); Array.Reverse(myArray); Console.Write("逆序:"); for (int i = 0; i < 5; i++) { Console.Write(myArray[i]); if (i != 4) Console.Write(","); } Console.WriteLine(); Console.WriteLine("平均值:" + strAverage); Console.WriteLine("最大值:" + max); Console.ReadKey(); } } } 运行结果最大值、最小值和平均值代码using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp5 { class Program { static void Main(string[] args) { double j = 1; int[] arr = new int[100]; int sum = 0, maxl = 0, minl = 0; Console.WriteLine("请输入数字,输入-1结束输入"); arr[0] = Int32.Parse(Console.ReadLine()); sum += arr[0]; maxl = arr[0]; minl = arr[0]; for (int i = 1; i < 100; i++) { arr[i] = Int32.Parse(Console.ReadLine()); if (arr[i] == -1) { break; } sum += arr[i]; maxl = Math.Max(maxl, arr[i]); minl = Math.Min(minl, arr[i]); ++j; } double ave = (double)sum / j; Console.WriteLine("最大值"+maxl); Console.WriteLine("最小值"+minl); Console.WriteLine("平均值"+ave); } } } 结果
训练检测口罩模型下载项目https://github.com/Megvii-BaseDetection/YOLOX打开项目安装环境pip install -r requirements.txt如果报错pip install -c esri pycocotools第一步下载数据集在datasets文件夹下新建VOCdevkit文件夹并将下载的data文件夹放进去,并改名为VOC2020。在VOC2020文件夹下新建ImageSets文件夹,在建Main文件夹。下载make_train_and_test.py文件并运行import os import random train_percent = 0.8 test_percent = 0.2 xmlfilepath = 'VOCdevkit/VOC2020/Annotations' txtsavepath = 'VOCdevkit/VOC2020/ImageSets' total_xml = os.listdir(xmlfilepath) num = len(total_xml) list = range(num) tr = int(num * train_percent) te = int(num * test_percent) train = random.sample(list, tr) test = random.sample(list, te) ftest = open('VOCdevkit/VOC2020/ImageSets/Main/test.txt', 'w') ftrain = open('VOCdevkit/VOC2020/ImageSets/Main/train.txt', 'w') for i in list: name = total_xml[i][:-4] + '\n' if i in train: ftrain.write(name) else: ftest.write(name) ftrain.close() ftest.close()生成训练样本和测试样本的下标第二步修改代码yolox_voc_s.py相关代码改为self.num_classes = 2然后voc_classea.pu改为VOC_CLASSES = ( "no_masked", "masked", ) voc.py修改训练模型python tools/train.py -f ./exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp 16 -o会报错Traceback (most recent call last): File "./tools/train.py", line 13, in from yolox.core import launchModuleNotFoundError: No module named 'yolox'路径错误在tools/train.py开头加上开头路径import sys sys.path.append(r"D:\PycharmProjects\YOLOX-main")报错 DataLoader workeryolox_voc_s.py添加 self.data_num_workers = 0报错OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.环境冲突tools/train.py添加代码import os os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'报错 ERROR | yolox.core.launch:98 - An error has been caught in function 'launch', process 'MainProcess' (22360), thread 'MainThread' (18700):修改voc.py
Lenet5训练模型下载数据集可以提前下载也可以在线下载train_data = torchvision.datasets.MNIST(root='./',download=True,train=True,transform=transform) test_data = torchvision.datasets.MNIST(root='./',download=True,train=False,transform=transform)训练模型import torch import torchvision class Lenet5(torch.nn.Module): def __init__(self): super(Lenet5, self).__init__() self.model = torch.nn.Sequential( torch.nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5), # 1*32*32 # 6*28*28 torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, # 6*14*14 stride=2), torch.nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5), # 16 *10*10 torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, stride=2), # 16*5*5 torch.nn.Conv2d(in_channels=16, out_channels=120, kernel_size=5), # 120*1*1 torch.nn.ReLU(), torch.nn.Flatten(), # 展平 成120*1维 torch.nn.Linear(120, 84), torch.nn.Linear(84, 10) ) def forward(self,x): x = self.model(x) return x transform = torchvision.transforms.Compose( [torchvision.transforms.Resize(32), torchvision.transforms.ToTensor()] ) train_data = torchvision.datasets.MNIST(root='./',download=True,train=True,transform=transform) test_data = torchvision.datasets.MNIST(root='./',download=True,train=False,transform=transform) #分批次加载数据 64 128 train_loader =torch.utils.data.DataLoader(train_data,batch_size=64,shuffle=True) test_loader =torch.utils.data.DataLoader(test_data,batch_size=64,shuffle=True) #gpu device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') net = Lenet5().to(device) loss_func = torch.nn.CrossEntropyLoss().to(device) optim = torch.optim.Adam(net.parameters(),lr=0.001) net.train() for epoch in range(10): for step,(x,y) in enumerate(train_loader): x = x.to(device) y = y.to(device) ouput = net(x) loss = loss_func(ouput,y) #计算损失 optim.zero_grad() loss.backward() optim.step() print('epoch:',epoch,"loss:",loss) torch.save(net,'net.pkl')import torch import torchvision class Lenet5(torch.nn.Module): def __init__(self): super(Lenet5, self).__init__() self.model = torch.nn.Sequential( torch.nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5), # 1*32*32 # 6*28*28 torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, # 6*14*14 stride=2), torch.nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5), # 16 *10*10 torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2, stride=2), # 16*5*5 torch.nn.Conv2d(in_channels=16, out_channels=120, kernel_size=5), # 120*1*1 torch.nn.ReLU(), torch.nn.Flatten(), # 展平 成120*1维 torch.nn.Linear(120, 84), torch.nn.Linear(84, 10) ) def forward(self,x): x = self.model(x) return x transform = torchvision.transforms.Compose( [torchvision.transforms.Resize(32), torchvision.transforms.ToTensor()] ) test_data = torchvision.datasets.MNIST(root='./',download=False,train=False,transform=transform) test_loader =torch.utils.data.DataLoader(test_data,batch_size=64,shuffle=True) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') net = torch.load('net.pkl') net.eval() #表明进行推理 with torch.no_grad(): for step,(x,y) in enumerate(test_loader): x,y = x.to(device),y.to(device) pre = net(x) print(pre) pre_y = torch.max(pre.cpu(),1)[1].numpy() print(pre_y) y = y.cpu().numpy() acc = (pre_y == y).sum()/len(y) print("accu:",acc)
使用cifar10数据集和alexnet网络模型训练分类模型下载cifar10数据集代码:import torchvision import torch transform = torchvision.transforms.Compose( [torchvision.transforms.ToTensor(), torchvision.transforms.Resize(224)] ) train_set = torchvision.datasets.CIFAR10(root='./',download=False,train=True,transform=transform) test_set = torchvision.datasets.CIFAR10(root='./',download=False,train=False,transform=transform) train_loader = torch.utils.data.DataLoader(train_set,batch_size=8,shuffle=True) test_loader = torch.utils.data.DataLoader(test_set,batch_size=8,shuffle=True) class Alexnet(torch.nn.Module): #1080 2080 def __init__(self,num_classes=10): super(Alexnet,self).__init__() net = torchvision.models.alexnet(pretrained=False) #迁移学习 net.classifier = torch.nn.Sequential() self.features = net self.classifier = torch.nn.Sequential( torch.nn.Dropout(0.3), torch.nn.Linear(256 * 6 * 6, 4096), torch.nn.ReLU(inplace=True), torch.nn.Dropout(0.3), torch.nn.Linear(4096, 4096), torch.nn.ReLU(inplace=True), torch.nn.Linear(4096, num_classes), ) def forward(self,x): x = self.features(x) x = x.view(x.size(0),-1) x = self.classifier(x) return x device = torch.device('cpu') net = Alexnet().to(device) loss_func = torch.nn.CrossEntropyLoss().to(device) optim = torch.optim.Adam(net.parameters(),lr=0.001) net.train() for epoch in range(10): for step,(x,y) in enumerate(train_loader): # 28*28*1 32*32*3 x,y = x.to(device),y.to(device) output = net(x) loss = loss_func(output,y) optim.zero_grad() loss.backward() optim.step() print("epoch:",epoch,'loss:',loss)
深度学习1. 深度学习介绍深度学习(Deep learning)是机器学习的一个分支领域,其源于人工神经网络的研究。深度学习广泛应用在计算机视觉,音频处理,自然语言处理等诸多领域。人工神经网络(Artificial Neural Network),以数学模型模拟神经元活动,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。生物神经细胞结构感知器模型2. 深度学习原理前向传播(Forward Propagation),从输入经过一层层隐层计算得到输出的过程,也就是加权求和,然后经过一个激活函数。反向传播(Backward Propagation)则是与前向传播的计算方向相反,它是计算输出值与真实值之间的误差,通过网络反向流动来计算每一层参数的梯度(偏导数),来更新训练参数。1)常用激活函数1、Sigmoid函数导数2、tanh函数导数3、Relu函数导数4、Leaky Relu函数导数2)常用损失函数1、均方差损失函数2、交叉熵损失函数(3)常用优化函数1、SGD:随机梯度下降优化器2、Momentum:带动量的随机梯度下降3、Nesterov Accelerated Gradient:牛顿加速梯度下降4、Adagrad(Adaptive gradient):自适应梯度下降5、Adadelta6、RMSprop6、Adam:Adaptive Moment Estimation3. 深度学习实现深度学习网络实现回归深度学习网络实现分类
卷积神经网络--CNN1. 卷积神经网络介绍卷积神经网络(Convolutional Neural Networks,CNN)是一种包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。常见的CNN网络有LeNet-5、VGGNet、GoogleNet、ResNet、DenseNet、MobileNet等。CNN主要应用场景: 图像分类、图像分割 、 目标检测 、 自然语言处理等领域。2. 卷积神经网络基本结构及原理卷积神经网络基本结构CNN基本结构:INPUT -> 卷积->激活 -> 池化 -> 全连接 ->OUTPUT卷积层对输入的图像数据与卷积核做卷积运算提取图像的高阶特征卷积过程的几个参数1、深度(depth):卷积核个数,也称神经元个数,决定输出的特征图的数量。2、步长(stride):卷积核滑动一次的大小,决定滑动多少步可以到达边缘。3、填充值(padding):在外围边缘补充0的层数。卷积过程卷积网络最主要的两个特征1、局部感知2、权值共享激活层、Relu函数池化层下采样(downsamples),对输入的特征图进行压缩;一方面使特征图变小,简化网络计算复杂度,有效控制过拟合;另一方面进行特征压缩,提取主要特征。池化,规模一般为 2*2,操作一般有2种:最大池化(Max Pooling)。取4个点的最大值。这是最常用的池化方法。均值池化(Mean Pooling)。取4个点的均值。全连接层连接所有的特征,将输出值送给分类器,实现分类。3. pytorch中卷积的实现卷积层torch.nn.Conv2d()参数说明in_channels:输入通道数(深度)out_channels:输出通道数(深度)kernel_size:滤波器(卷积核)大小stride:表示滤波器滑动的步长padding:是否进行零填充bias:默认为 True,表示使用偏置groups:控制分组卷积,默认不分组,为1组。dilation:卷积对输入的空间间隔,默认为 True激活层torch.nn.ReLU()参数说明inplace:是否在原数据进行操作,默认是False池化层torch.nn.MaxPool2d()torch.nn.AvgPool2d()参数说明kernel_size :表示做最大池化的窗口大小stride:步长padding:是否进行零填充dilation:卷积对输入的空间间隔,默认为 True全连接层torch.nn.Linear()参数说明in_features :输入特征数;out_features:输出特征数;bias:默认为 True,表示使用偏置4. 经典卷积神经网络介绍Lenet-5LeNet5卷积神经网络源于Yann LeCun在1998年发表的论文:Gradient-based Learning Applied to Document Recognition,是一种用于手写数字识别的卷积神经网络。LeNet-5是CNN网络架构中最知名的网络模型,是卷积神经网络的开山之作。AlexNet2012 年, AlexNet 横空出世。AlexNet 使⽤卷积神经⽹络,并以很⼤的优势赢得了ImageNet 2012 图像识别挑战赛冠军。Alexnet模型由5个卷积层和3个池化Pooling 层 ,其中还有3个全连接层构成。AlexNet 跟 LeNet 结构类似,但使⽤了更多的卷积层和更⼤的参数空间来拟合⼤规模数据集 ImageNet。它是浅层神经⽹络和深度神经⽹络的分界线。cifar10数据介绍CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含 10 个类别的 RGB 彩色图 片:飞机( a叩lane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。图片的尺寸为 32×32 ,数据集中一共有 50000 张训练圄片和10000 张测试图片VGGNetVGGNet 是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军。VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。VGG可以看成是加深版本的AlexNet。都是conv layer + FC layerGoogleNetGoogleNet是2014年Google团队提出的一种全新的深度学习结构,赢得了2014 年 ILSVRC 分类任务的冠军。GoogLeNet是第一个使用并行网络结构的经典模型,这在深度学习的发展历程中是具有开创性意义的。GoogLeNet最基本的网络块是Inception,它是一个并联网络块,经过不断的迭代优化,发展出了Inception-v1、Inception-v2、Inception-v3、Inception-v4、Inception-ResNet共5个版本。Inception家族的迭代逻辑是通过结构优化来提升模型泛化能力、降低模型参数。ResNetResNet(残差网络) 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思。ResNet block有两种,一种两层结构,一种三层结构MobileNetMobileNet是谷歌在2017年提出,专注于移动端或者嵌入式设备中的轻量级CNN网络。MobileNet的基本单元是深度可分离卷积,其可以分解为两个更小的操作:depthwise convolution和pointwise convolution。
安装labelimg,以及报错目标检测标注工具:labelimg 安装 pip install labelimg 使用 labelimg报错ERROR: spyder 4.1.4 requires pyqtwebengine<5.13; python_version >= "3", which is not installed. ERROR: spyder 4.1.4 has requirement pyqt5<5.13; python_version >= "3", but you'll have pyqt5 5.15.6 which is incompatible版本不匹配问题打开Anaconda Prompt使用命令安装Spyderpip install spyder==4.1.4或者pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ spyder==4.1.4使用 labelimg在安装环境下找到labelimg.exe复制到桌面打开打开一张图片
输出菱形编程自动输出如下图形,由屏幕输入指定行数(奇数),实现后封装为函数,以行数作为参数值。 输入一个n,表示左边两个菱形图形(实心和空心)的行数(或者一半行数) 利用循环语句实现输出。说明:此题相当于两个题,要打印出两个图。 提示:第一个菱形分析*号个数和规律;第二题分析*出现位置及变化规律 做题思路先输出上半部分,再输出下部分这样就相当于输出一个正三角形和一个倒三角形。并且正三角形的行数比倒三角形的行数多一行,多出的一行是两个三角形的线。正三角形for(i=1; i<=n; i++)//上半部分 { for(j=1; j<=n-i; j++)//"n-i"当前行第一个星号左边的空格数// cout << ' '; for(j=1; j<=2*i-1; j++)//"2*i-1"为当前行的星号数// cout << '*'; cout << endl;//换行// }倒三角形for(i=n; i>=1; i--)//下半部分 { for(j=1; j<=n-i+1; j++)//"n-i"当前行第一个星号左边的空格数// cout << ' '; for(j=1; j<=2*i-1; j++)//"2*i-1"为当前行的星号数// cout << '*'; cout << endl;//换行// }改变两者的nn_u=n/2+1;//上半部分行数 n_l=n/2;//下半部分行数 代码:#include <iostream> using namespace std; int main() { int n,i,j,n_u,n_l; cout << "输入行数一个奇数:"; cin >> n; n_u=n/2+1;//上半部分行数 n_l=n/2;//下半部分行数 for(i=1; i<=n_u; i++)//上半部分 { for(j=1; j<=n_u-i; j++)//"n_u-i"当前行第一个星号左边的空格数// cout << ' '; for(j=1; j<=2*i-1; j++)//"2*i-1"为当前行的星号数// cout << '*'; cout << endl;//换行// } for(i=n_l; i>=1; i--)//下半部分 { for(j=1; j<=n_l-i+1; j++)//"n_l-i"当前行第一个星号左边的空格数// cout << ' '; for(j=1; j<=2*i-1; j++)//"2*i-1"为当前行的星号数// cout << '*'; cout << endl;//换行// } }空心菱形做题思路先输出上半部分,再输出下部分这样就相当于输出一个正三角形和一个倒三角形。并且正三角形的行数比倒三角形的行数多一行,多出的一行是两个三角形的线。在实心的基础上改进不同点在于*的输出if(i==1) cout << '*'; else{ cout << '*'; for(j=1; j<=2*(i-1)-1; j++)//"2*i-1"为当前行的星号数// cout << ' '; cout << '*'; }结果代码#include <iostream> using namespace std; int main() { int n,i,j,n_u,n_l; cout << "输入行数一个奇数:"; cin >> n; n_u=n/2+1;//上半部分行数 n_l=n/2;//下半部分行数 for(i=1; i<=n_u; i++)//上半部分 { for(j=1; j<=n_u-i; j++)//"n_u-i"当前行第一个星号左边的空格数// cout << ' '; if(i==1) cout << '*'; else{ cout << '*'; for(j=1; j<=2*(i-1)-1; j++)//"2*i-1"为当前行的星号数// cout << ' '; cout << '*'; } cout << endl;//换行// } for(i=n_l; i>=1; i--)//下半部分 { for(j=1; j<=n_l-i+1; j++)//"n_l-i"当前行第一个星号左边的空格数// cout << ' '; if(i==1) cout << '*'; else{ cout << '*'; for(j=1; j<=2*(i-1)-1; j++)//"2*i-1"为当前行的星号数// cout << ' '; cout << '*'; } cout << endl;//换行// } }
实现基于CNN网络的手写字体识别首先下载数据1、搭建CNN网络模型;class CNN(nn.Module): def __init__(self): super(CNN,self).__init__() ''' 一般来说,卷积网络包括以下内容: 1.卷积层 2.神经网络 3.池化层 ''' self.conv1=nn.Sequential( nn.Conv2d( #--> (1,28,28) in_channels=1, #传入的图片是几层的,灰色为1层,RGB为三层 out_channels=16, #输出的图片是几层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=2 ), # 2d代表二维卷积 --> (16,28,28) nn.ReLU(), #非线性激活层 nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (16,14,14) ) self.conv2=nn.Sequential( nn.Conv2d( # --> (16,14,14) in_channels=16, #这里的输入是上层的输出为16层 out_channels=32, #在这里我们需要将其输出为32层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2= ), # --> (32,14,14) nn.ReLU(), nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (32,7,7),这里是三维数据 ) self.out=nn.Linear(32*7*7,10) #注意一下这里的数据是二维的数据 def forward(self,x): x=self.conv1(x) x=self.conv2(x) #(batch,32,7,7) #然后接下来进行一下扩展展平的操作,将三维数据转为二维的数据 x=x.view(x.size(0),-1) #(batch ,32 * 7 * 7) output=self.out(x) return output2、设计损失函数,选择优化函数;# 添加优化方法 optimizer=torch.optim.Adam(cnn.parameters(),lr=LR) # 指定损失函数使用交叉信息熵 loss_fn=nn.CrossEntropyLoss()3、实现模型训练与测试。step=0 for epoch in range(EPOCH): #加载训练数据 for step,data in enumerate(train_loader): x,y=data #分别得到训练数据的x和y的取值 b_x=Variable(x) b_y=Variable(y) output=cnn(b_x) #调用模型预测 loss=loss_fn(output,b_y)#计算损失值 optimizer.zero_grad() #每一次循环之前,将梯度清零 loss.backward() #反向传播 optimizer.step() #梯度下降 #每执行50次,输出一下当前epoch、loss、accuracy if (step%50==0): #计算一下模型预测正确率 test_output=cnn(test_x) y_pred=torch.max(test_output,1)[1].data.squeeze() accuracy=sum(y_pred==test_y).item()/test_y.size(0) print('now epoch : ', epoch, ' | loss : %.4f ' % loss.item(), ' | accuracy : ' , accuracy)代码:import torch import torch.nn as nn from torch.autograd import Variable import torch.utils.data as Data import torchvision #Hyper prameters EPOCH=1 BATCH_SIZE=50 LR=0.001 DOWNLOAD_MNIST=False train_data = torchvision.datasets.MNIST( root='./mnist', train=True, transform=torchvision.transforms.ToTensor(), #将下载的文件转换成pytorch认识的tensor类型,且将图片的数值大小从(0-255)归一化到(0-1) download=DOWNLOAD_MNIST ) train_loader=Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True) test_data=torchvision.datasets.MNIST( root='./mnist', train=False, ) with torch.no_grad(): test_x=Variable(torch.unsqueeze(test_data.data, dim=1)).type(torch.FloatTensor)[:2000]/255 #只取前两千个数据吧,差不多已经够用了,然后将其归一化。 test_y=test_data.targets[:2000] '''开始建立CNN网络''' class CNN(nn.Module): def __init__(self): super(CNN,self).__init__() ''' 一般来说,卷积网络包括以下内容: 1.卷积层 2.神经网络 3.池化层 ''' self.conv1=nn.Sequential( nn.Conv2d( #--> (1,28,28) in_channels=1, #传入的图片是几层的,灰色为1层,RGB为三层 out_channels=16, #输出的图片是几层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=2 ), # 2d代表二维卷积 --> (16,28,28) nn.ReLU(), #非线性激活层 nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (16,14,14) ) self.conv2=nn.Sequential( nn.Conv2d( # --> (16,14,14) in_channels=16, #这里的输入是上层的输出为16层 out_channels=32, #在这里我们需要将其输出为32层 kernel_size=5, #代表扫描的区域点为5*5 stride=1, #就是每隔多少步跳一下 padding=2, #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2= ), # --> (32,14,14) nn.ReLU(), nn.MaxPool2d(kernel_size=2), #设定这里的扫描区域为2*2,且取出该2*2中的最大值 --> (32,7,7),这里是三维数据 ) self.out=nn.Linear(32*7*7,10) #注意一下这里的数据是二维的数据 def forward(self,x): x=self.conv1(x) x=self.conv2(x) #(batch,32,7,7) #然后接下来进行一下扩展展平的操作,将三维数据转为二维的数据 x=x.view(x.size(0),-1) #(batch ,32 * 7 * 7) output=self.out(x) return output cnn=CNN() # print(cnn) # 添加优化方法 optimizer=torch.optim.Adam(cnn.parameters(),lr=LR) # 指定损失函数使用交叉信息熵 loss_fn=nn.CrossEntropyLoss() ''' 开始训练我们的模型哦 ''' step=0 for epoch in range(EPOCH): #加载训练数据 for step,data in enumerate(train_loader): x,y=data #分别得到训练数据的x和y的取值 b_x=Variable(x) b_y=Variable(y) output=cnn(b_x) #调用模型预测 loss=loss_fn(output,b_y)#计算损失值 optimizer.zero_grad() #每一次循环之前,将梯度清零 loss.backward() #反向传播 optimizer.step() #梯度下降 #每执行50次,输出一下当前epoch、loss、accuracy if (step%50==0): #计算一下模型预测正确率 test_output=cnn(test_x) y_pred=torch.max(test_output,1)[1].data.squeeze() accuracy=sum(y_pred==test_y).item()/test_y.size(0) print('now epoch : ', epoch, ' | loss : %.4f ' % loss.item(), ' | accuracy : ' , accuracy) ''' 打印十个测试集的结果 ''' test_output=cnn(test_x[:10]) y_pred=torch.max(test_output,1)[1].data.squeeze() #选取最大可能的数值所在的位置 print(y_pred.tolist(),'predecton Result') print(test_y[:10].tolist(),'Real Result')
聚类算法案例聚类算法聚类算法(Clustering),是对大量未知标注的数据集,按数据的内在相似性,将数据集划分为多个互不相交的子集,每个子集称为一个簇,使簇内数据的相似度较大而簇间数据的相似度较小。聚类算法属于无监督机器学习,只有数据x,没有标签y。常见的聚类算法:k-Means、 spectral clustering、mean-shift等。from sklearn.cluster import KMeans,MiniBatchKMeans from sklearn.datasets import make_blobs import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score,calinski_harabasz_score,davies_bouldin_score X,_ = make_blobs(n_samples=1000) plt.scatter(X[:,0],X[:,1],marker='o') plt.show() km = KMeans(n_clusters=3) km.fit(X) x_pred = km.predict(X) plt.scatter(X[:,0],X[:,1],c=x_pred) plt.show() si = silhouette_score(X,km.predict(X)) ca = calinski_harabasz_score(X,km.predict(X)) dv = davies_bouldin_score(X,km.predict(X)) print("轮廓系数为:",si) print("calinski_harabasz_score为:",ca) print('davies_bouldin_score为:',dv)使用聚类算法对图像进行压缩其核心思想是:通过聚类将颜色表示数量减少。RGB图像,3个通道,每个通道用8位表示,通过聚类,选取颜色空间中的n个聚类,将图片上的每种颜色分配到一个类别,那么表示一种颜色只需要log 2 n位,对图片进行了压缩。图片压缩import cv2 from sklearn.cluster import KMeans import numpy as np img = cv2.imread('lena.png') # w,h ,c img_data = img.reshape(-1,3) kmeans = KMeans(n_clusters=16) kmeans.fit(img_data) new_img = kmeans.cluster_centers_[kmeans.labels_] print(new_img.dtype) new_img = new_img.astype(np.uint8) new_img = new_img.reshape(img.shape) cv2.imwrite('new_img1.png',new_img)压缩后的图片
公共自行车使用量预测公共自行车低碳、环保、健康,并且解决了交通中“最后一公里”的痛点,在全国各个城市越来越受欢迎。本练习赛的数据取自于两个城市某街道上的几处公共自行车停车桩。我们希望根据时间、天气等信息,预测出该街区在一小时内的被借取的公共自行车的数量。train.csv 训练集,文件大小 273kbtest.csv 预测集, 文件大小 179kb公共自行车使用量预测训练集中共有10000条样本,预测集中有7000条样本。代码实现import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.svm import SVR from sklearn.metrics import mean_squared_error,r2_score train = pd.read_csv('train.csv') #读取数据 test = pd.read_csv('test.csv') train = train.drop('id',axis=1) #删除无关的数据 id列 test = test.drop('id',axis=1) train_x = train.iloc[:,train.columns != 'y'] #从数据集中取出训练的x train_y = train.iloc[:,train.columns == 'y'] #从数据集中取出训练的y train_y = np.array(train_y).flatten() #将y展平 std = StandardScaler() #对数据进行标准化 train_x = std.fit_transform(train_x) test_x = std.transform(test) svr = SVR() #选择模型 svr.fit(train_x,train_y) #训练 ms = mean_squared_error(svr.predict(train_x),train_y) #进行模型评估 print("在训练集上的均方误差是:",ms) r2 = r2_score(svr.predict(train_x),train_y) print("在训练集上的r2值是:",r2) test_y = svr.predict(test_x) #在测试集上对数据进行预测 print(test_y) 结果
算法案例手写数字识别MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。选择算法,并保存模型import pickle from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score from sklearn.ensemble import RandomForestClassifier import joblib with open('mnist.pkl','rb') as f: train, val ,test = pickle.load(f,encoding='iso-8859-1') train_x = train[0] train_y = train[1] test_x = test[0] test_y = test[1] # lr = LogisticRegression() # lr.fit(train_x,train_y) rdt = RandomForestClassifier() rdt.fit(train_x,train_y) acc = accuracy_score(rdt.predict(train_x),train_y) print("训练集上的准确率为:",acc) acc = accuracy_score(rdt.predict(test_x),test_y) print("测试集上的准确率为:",acc) joblib.dump(rdt,'rdt.pkl') 加载模型给出识别图片颜色转换import cv2 img = cv2.imread('1.png') b = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) w = 255 - b cv2.imwrite('9.png',w)import joblib import cv2 from sklearn.preprocessing import StandardScaler rdt = joblib.load('rdt.pkl') #读取图片 img = cv2.imread('9.png',0) img = cv2.resize(img,(28,28)) test = img.reshape(1,28*28) std = StandardScaler() test = std.fit_transform(test) pre = rdt.predict(test) print(pre) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()下标为7,查找图片。。0 。。。1。。。2。。。3。。4。。5。。。6。。7。。。8。。。9
实现Kmeans算法实现聚类要求:1、根据算法流程,手动实现Kmeans算法;2、调用sklearn中聚类算法,对给定数据集进行聚类分析;3、对比上述2中Kmeans算法的聚类效果。读取文件def loadFile(path): dataList = [] #打开文件:以二进制读模式、utf-8格式的编码方式 打开 fr = open(path,"r",encoding='UTF-8') record = fr.read() fr.close #按照行转换为一维表即包含各行作为元素的列表,分隔符有'\r', '\r\n', \n' recordList = record.splitlines() #逐行遍历:行内字段按'\t'分隔符分隔,转换为列表 for line in recordList: if line.strip(): dataList .append(list(map(float, line.split('\t')))) #返回转换后的矩阵 recordmat = np.mat(dataList ) return recordmat手动实现Kmeans算法def kMeans(dataset, k): m = np.shape(dataset)[0] ClustDist = np.mat(np.zeros((m, 2))) cents = randCents(dataset, k) clusterChanged = True # 循环迭代,得到最近的聚类中心 while clusterChanged: clusterChanged = False for i in range(m): DistList = [distEclud(dataset[i, :], cents[jk,:]) for jk in range(k)] minDist = min(DistList) minIndex = DistList.index(minDist) if ClustDist[i, 0] != minIndex: clusterChanged = True ClustDist[i, :] = minIndex, minDist # 更新聚类 for cent in range(k): ptsInClust = dataset[np.nonzero(ClustDist[:, 0].A == cent)[0]] # 更新聚类中心cents,axis=0按列求均值 cents[cent, :] = np.mean(ptsInClust, axis=0) # 返回聚类中心和聚类分配矩阵 return cents, ClustDist处理数据path_file = "TESTDATA.TXT" recordMat = loadFile(path_file) k = 4 cents, distMat = kMeans(recordMat, k)绘制数据散点图plt.subplot(311) plt.grid(True)# 生成网格 for indx in range(len(distMat)): if distMat[indx, 0] == 0: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='red', marker='o') if distMat[indx, 0] == 1: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='blue', marker='o') if distMat[indx, 0] == 2: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='cyan', marker='o') if distMat[indx, 0] == 3: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='green', marker='o') #if distMat[indx, 0] == 4: #plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='black', marker='o')绘制聚类中心x = [cents[i,0] for i in range(k)] y = [cents[i,1] for i in range(k)] plt.scatter(x, y, s = 80, c='yellow', marker='o') plt.title('Kmeans')调用sklearn中聚类算法from sklearn.cluster import KMeans X = np.array(recordMat) # 生成初始聚类数据 #kmeans_model = KMeans(n_clusters=k, init='k-means++') # 聚类模型 kmeans_model = KMeans(n_clusters=k, init='random') # 聚类模型 kmeans_model.fit(X) # 训练聚类模型 绘制k-Means聚类结果# plt.figure()# 创建窗口 plt.subplot(312) plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴 plt.grid(True)# 生成网格 colors = ['r', 'g', 'b','c'] # 聚类颜色 markers = ['o', 's', 'D', '+'] # 聚类标志 for i, l in enumerate(kmeans_model.labels_): plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None') plt.title('K = %s,random' %(k))对比效果:整合代码:import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans def loadFile(path): dataList = [] #打开文件:以二进制读模式、utf-8格式的编码方式 打开 fr = open(path,"r",encoding='UTF-8') record = fr.read() fr.close #按照行转换为一维表即包含各行作为元素的列表,分隔符有'\r', '\r\n', \n' recordList = record.splitlines() #逐行遍历:行内字段按'\t'分隔符分隔,转换为列表 for line in recordList: if line.strip(): dataList .append(list(map(float, line.split('\t')))) #返回转换后的矩阵 recordmat = np.mat(dataList ) return recordmat def distEclud(vecA, vecB): return np.linalg.norm(vecA-vecB, ord=2) def randCents(dataSet, k): n = np.shape(dataSet)[1] cents = np.mat(np.zeros((k,n))) for j in range(n): #质心必须在数据集范围内,也就是在min到max之间 minCol = min(dataSet[:,j]) maxCol = max(dataSet[:,j]) #利用随机函数生成0到1.0之间的随机数 cents [:,j] = np.mat(minCol + float(maxCol - minCol) * np.random.rand(k,1)) return cents def kMeans(dataset, k): m = np.shape(dataset)[0] ClustDist = np.mat(np.zeros((m, 2))) cents = randCents(dataset, k) clusterChanged = True # 循环迭代,得到最近的聚类中心 while clusterChanged: clusterChanged = False for i in range(m): DistList = [distEclud(dataset[i, :], cents[jk,:]) for jk in range(k)] minDist = min(DistList) minIndex = DistList.index(minDist) if ClustDist[i, 0] != minIndex: clusterChanged = True ClustDist[i, :] = minIndex, minDist # 更新聚类 for cent in range(k): ptsInClust = dataset[np.nonzero(ClustDist[:, 0].A == cent)[0]] # 更新聚类中心cents,axis=0按列求均值 cents[cent, :] = np.mean(ptsInClust, axis=0) # 返回聚类中心和聚类分配矩阵 return cents, ClustDist path_file = "TESTDATA.TXT" recordMat = loadFile(path_file) k = 4 cents, distMat = kMeans(recordMat, k) # 绘制数据散点图 plt.subplot(311) plt.grid(True)# 生成网格 for indx in range(len(distMat)): if distMat[indx, 0] == 0: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='red', marker='o') if distMat[indx, 0] == 1: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='blue', marker='o') if distMat[indx, 0] == 2: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='cyan', marker='o') if distMat[indx, 0] == 3: plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='green', marker='o') #if distMat[indx, 0] == 4: #plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='black', marker='o') # 绘制聚类中心 x = [cents[i,0] for i in range(k)] y = [cents[i,1] for i in range(k)] plt.scatter(x, y, s = 80, c='yellow', marker='o') plt.title('Kmeans') X = np.array(recordMat) # 生成初始聚类数据 # plt.figure()# 创建窗口 plt.subplot(312) plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴 plt.grid(True)# 生成网格 colors = ['r', 'g', 'b','c'] # 聚类颜色 markers = ['o', 's', 'D', '+'] # 聚类标志 #kmeans_model = KMeans(n_clusters=k, init='k-means++') # 聚类模型 kmeans_model = KMeans(n_clusters=k, init='random') # 聚类模型 kmeans_model.fit(X) # 训练聚类模型 # 绘制k-Means聚类结果 for i, l in enumerate(kmeans_model.labels_): plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None') plt.title('K = %s,random' %(k)) X = np.array(recordMat) # 生成初始聚类数据 # plt.figure()# 创建窗口 plt.subplot(313) plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴 plt.grid(True)# 生成网格 colors = ['r', 'g', 'b','c'] # 聚类颜色 markers = ['o', 's', 'D', '+'] # 聚类标志 kmeans_model = KMeans(n_clusters=k, init='k-means++') # 聚类模型 # kmeans_model = KMeans(n_clusters=k, init='random') # 聚类模型 kmeans_model.fit(X) # 训练聚类模型 # 绘制k-Means聚类结果 for i, l in enumerate(kmeans_model.labels_): plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None') plt.title('K = %s,k-means++' %(k)) plt.show()
暴力调参案例使用的数据集为from sklearn.datasets import fetch_20newsgroups因为在线下载慢,可以提前下载保存到首先引入所需库import numpy as np import pandas as pd defaultencoding = 'utf-8' import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.naive_bayes import MultinomialNB from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import GridSearchCV from sklearn.feature_selection import SelectKBest,chi2 import sklearn.metrics as metrics from sklearn.datasets import fetch_20newsgroups import sys编码问题显示if sys.getdefaultencoding() != defaultencoding: reload(sys) sys.setdefaultencoding(defaultencoding) mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False如果报错的话可以改为import importlib,sys if sys.getdefaultencoding() != defaultencoding: importlib.reload(sys) sys.setdefaultencoding(defaultencoding) mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False用来正常显示中文mpl.rcParams['font.sans-serif']=[u'simHei']用来正常正负号mpl.rcParams['axes.unicode_minus']=False获取数据#data_home="./datas/"下载的新闻的保存地址subset='train'表示从训练集获取新闻categories获取哪些种类的新闻 datas=fetch_20newsgroups(data_home="./datas/",subset='train',categories=['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc']) datas_test=fetch_20newsgroups(data_home="./datas/",subset='test',categories=['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc']) train_x=datas.data#获取新闻X train_y=datas.target#获取新闻Y test_x=datas_test.data#获取测试集的x test_y=datas_test.target#获取测试集的y自动调参import time def setParam(algo,name): gridSearch = GridSearchCV(algo,param_grid=[],cv=5) m=0 if hasattr(algo,"alpha"): n=np.logspace(-2,9,10) gridSearch.set_params(param_grid={"alpha":n}) m=10 if hasattr(algo,"max_depth"): depth=[2,7,10,14,20,30] gridSearch.set_params(param_grid={"max_depth":depth}) m=len(depth) if hasattr(algo,"n_neighbors"): neighbors=[2,7,10] gridSearch.set_params(param_grid={"n_neighbors":neighbors}) m=len(neighbors) t1=time.time() gridSearch.fit(train_x,train_y) test_y_hat=gridSearch.predict(test_x) train_y_hat=gridSearch.predict(train_x) t2=time.time()-t1 print(name, gridSearch.best_estimator_) train_error=1-metrics.accuracy_score(train_y,train_y_hat) test_error=1-metrics.accuracy_score(test_y,test_y_hat) return name,t2/5*m,train_error,test_error选择算法调参朴素贝叶斯,随机森林,KNNalgorithm=[("mnb",MultinomialNB()),("random",RandomForestClassifier()),("knn",KNeighborsClassifier())] for name,algo in algorithm: result=setParam(algo,name) results.append(result)可视化#把名称,花费时间,训练错误率,测试错误率分别存到单个数组 names,times,train_err,test_err=[[x[i] for x in results] for i in range(0,4)] axes=plt.axes() axes.bar(np.arange(len(names)),times,color="red",label="耗费时间",width=0.1) axes.bar(np.arange(len(names))+0.1,train_err,color="green",label="训练集错误",width=0.1) axes.bar(np.arange(len(names))+0.2,test_err,color="blue",label="测试集错误",width=0.1) plt.xticks(np.arange(len(names)), names) plt.legend() plt.show()代码整合:#coding=UTF-8 import numpy as np import pandas as pd defaultencoding = 'utf-8' import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.naive_bayes import MultinomialNB from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import GridSearchCV from sklearn.feature_selection import SelectKBest,chi2 import sklearn.metrics as metrics from sklearn.datasets import fetch_20newsgroups import sys import importlib,sys if sys.getdefaultencoding() != defaultencoding: # reload(sys) importlib.reload(sys) sys.setdefaultencoding(defaultencoding) mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False #data_home="./datas/"下载的新闻的保存地址subset='train'表示从训练集获取新闻categories获取哪些种类的新闻 datas=fetch_20newsgroups(data_home="./datas/",subset='train',categories=['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc']) datas_test=fetch_20newsgroups(data_home="./datas/",subset='test',categories=['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc']) train_x=datas.data#获取新闻X train_y=datas.target#获取新闻Y test_x=datas_test.data#获取测试集的x test_y=datas_test.target#获取测试集的y tfidf=TfidfVectorizer(stop_words="english") train_x=tfidf.fit_transform(train_x,train_y)#向量转化 test_x=tfidf.transform(test_x)#向量转化 print(train_x.shape) best=SelectKBest(chi2,k=1000)#降维变成一千列 train_x = best.fit_transform(train_x,train_y)#转换 test_x = best.transform(test_x) import time def setParam(algo,name): gridSearch = GridSearchCV(algo,param_grid=[],cv=5) m=0 if hasattr(algo,"alpha"): n=np.logspace(-2,9,10) gridSearch.set_params(param_grid={"alpha":n}) m=10 if hasattr(algo,"max_depth"): depth=[2,7,10,14,20,30] gridSearch.set_params(param_grid={"max_depth":depth}) m=len(depth) if hasattr(algo,"n_neighbors"): neighbors=[2,7,10] gridSearch.set_params(param_grid={"n_neighbors":neighbors}) m=len(neighbors) t1=time.time() gridSearch.fit(train_x,train_y) test_y_hat=gridSearch.predict(test_x) train_y_hat=gridSearch.predict(train_x) t2=time.time()-t1 print(name, gridSearch.best_estimator_) train_error=1-metrics.accuracy_score(train_y,train_y_hat) test_error=1-metrics.accuracy_score(test_y,test_y_hat) return name,t2/5*m,train_error,test_error results=[] plt.figure() algorithm=[("mnb",MultinomialNB()),("random",RandomForestClassifier()),("knn",KNeighborsClassifier())] for name,algo in algorithm: result=setParam(algo,name) results.append(result) #把名称,花费时间,训练错误率,测试错误率分别存到单个数组 names,times,train_err,test_err=[[x[i] for x in results] for i in range(0,4)] axes=plt.axes() axes.bar(np.arange(len(names)),times,color="red",label="耗费时间",width=0.1) axes.bar(np.arange(len(names))+0.1,train_err,color="green",label="训练集错误",width=0.1) axes.bar(np.arange(len(names))+0.2,test_err,color="blue",label="测试集错误",width=0.1) plt.xticks(np.arange(len(names)), names) plt.legend() plt.show()结果:
机器学习机器学习(Machine Learning,ML)是一门多领域交叉学科,涉及 概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技 能,重新组织已有的知识结构使之不断改善自身的性能。普遍认为,机器学习的处理系统和算法是主要通过找出数据里隐藏 的模式进而做出预测的识别模式,它是人工智能的一个重要子领域。机器学习分类按照训练样本提供的信息以及反馈方式的不同,将机器学习算法分为有监督学习和无监督学习。有监督学习:训练数据集是有标签的;包括分类算法和回归算法。无监督学习:训练数据集是完全没有标签的;包括聚类算法。回归算法回归实际上就是“最佳拟合;回归算法(Regression),根据已有的数据拟合出一条最佳的直线、曲线、超平面或函数等,用于预测其它数据的目标值。回归算法最终预测出一个连续而具体的值。常见的回归算法:线性回归、KNN回归、支持向量机回归、决策树回归、随机森林回归。分类算法分类就是向事物分配标签;分类算法(Classification),是求取一个从输入变量(特征)到离散的输出变量(类别)之间的映射函数。分类算法中算法(函数)的最终结果是一个离散的数据值。常见的分类算法:KNN、逻辑回归、朴素贝叶斯、决策树、支持向量机、随机森林等。聚类算法“物以类聚,人以群分”聚类就是将数据集划分为互不相交的子集;聚类算法(Clustering),是对大量未知标注的数据集,按数据的内在相似性,将数据集划分为多个互不相交的子集,每个子集称为一个簇,使簇内数据的相似度较大而簇间数据的相似度较小。聚类算法属于无监督机器学习,只有数据x,没有标签y。常见的聚类算法:k-Means、 spectral clustering、mean-shift等。聚类的应用:数据分析、图像处理等。数据数据来源用户访问行为数据业务数据外部第三方数据学习过程中,使用公开的数据集进行开发。数据清洗和转换实际生产环境中机器学习比较耗时的一部分大部分情况下 ,收集得到的数据需要经过预处理后才能够为算法所使用,预处理的操作主要包括以下几个部分:数据过滤处理数据缺失处理可能的异常、错误或者异常值合并多个数据源数据数据汇总特征工程大部分的机器学习模型所处理的都是 特征,特征通常是输入变量所对应的可用于模型的数值表示。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。特征工程会直接影响机器学习的效果。特征工程包括:特征提取特征预处理特征降维特征提取特征提取是将任意数据(如文本或图像)转换为可用于机器学习的数字特征。特征提取APIsklearn.feature_extraction对字典数据进行特征提取sklearn.feature_extraction.DictVectorizer(sparse=True,…)对文本数据进行特征提取sklearn.feature_extraction.text.CountVectorizer(stop_words=[])特征预处理特征预处理是通过一些转换函数将特征数据转换成更加适合算法模型特征数据的过程。数值型数据的无量纲化:归一化标准化特征预处理APIsklearn.preprocessing归一化sklearn实现归一化API:sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… ) MinMaxScalar.fit_transform(X)X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array标准化sklearn实现标准化API:sklearn.preprocessing.StandardScaler( ) StandardScaler.fit_transform(X)X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array特征降维特征降维是指在某些限定条件下,降低特征个数,得到一组“不相关”特征的过程。特征降维的两种方式特征选择主成分分析数据集划分机器学习一般的数据集会划分为两个部分:训练数据:用于训练,构建模型测试数据:在模型检验时使用,用于评估模型是否有效划分比例:训练集:70% 80% 75%测试集:30% 20% 30%数据集划分apisklearn.model_selection.train_test_split(arrays, *options)分类模型评估回归模型评估聚类模型评估轮廓系数 :from sklearn.metrics import silhouette_score,Calinski-Harabasz Index :fromsklearn.metricsimportcalinski_harabasz_score戴维森堡丁指数(DBI):from sklearn.metrics import davies_bouldin_score模型保存模型保存和加载joblib模型保存:joblib.dump模型加载:joblib.load为了更好的理解机器学习的工作流程,接下来看个案例案例介绍引入所需的库和数据集from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error,r2_score from sklearn.linear_model import Lasso,Ridge,ElasticNet,BayesianRidge from sklearn.neighbors import KNeighborsRegressor,RadiusNeighborsRegressor from sklearn.svm import SVR from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor import joblib1、加载数据集data = load_boston()2、数据集划分train_x,test_x,train_y,test_y = train_test_split(data['data'],data['target'])3、进行特征工程 (进行数据标准化)std = StandardScaler() train_x = std.fit_transform(train_x) test_x = std.transform(test_x)4、选择模型训练# lr = LinearRegression() # y = w x +b # lr.fit(train_x,train_y) # lr = KNeighborsRegressor() # lr.fit(train_x,train_y) # lr = RadiusNeighborsRegressor() # lr.fit(train_x,train_y) # lr = SVR() # lr.fit(train_x,train_y) # lr = DecisionTreeRegressor() # lr.fit(train_x,train_y) lr = RandomForestRegressor() lr.fit(train_x,train_y)5、模型评估#训练集上的表现 error = mean_squared_error(train_y,lr.predict(train_x)) r2 = r2_score(train_y,lr.predict(train_x)) print("训练集上的表现误差:",error,"\nr2的值:",r2) error = mean_squared_error(test_y,lr.predict(test_x)) r2 = r2_score(test_y,lr.predict(test_x)) print("测试集上的表现误差:",error,"\nr2的值:",r2) # w = lr.coef_ #获取w # b = lr.intercept_ #获取b # print("线性回归的w",w) # print("线性回归的b",b)6.模型保存joblib.dump(std,'std.pkl') #标准化的模型进行保存 joblib.dump(lr,'lr.pkl')#线性回归模型进行保存
实验1、“小小计算器”扩展功能实现(1)扩充小小计算器功能:<1> “22 学生成绩排序” 定义学生结构体数组,长度为10,依次输入这十个学生的学号、姓名、成绩,利用冒泡排序,对这10个学生排序,从小到大输出这10个学生的信息,然后输出10个学生的总成绩和平时成绩代码整合:#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int main() { const int n=10; struct student //定义结构体变量 { string name; int num; double score; }; struct student student1[n]; struct student student2; int i,j; for(i=0;i<n;i++) { cout<<"请输入第"<<i+1<<"个学生的信息:"; cin>>student1[i].num >>student1[i].name >>student1[i].score; } double sum=0; double average; //各学生的平均成绩 for(i=0;i<n;i++) { sum=sum+student1[i].score; average=sum/3; } // 冒泡排序 for(int j=0;j<n;j++){ for(i=0;i<n-j-1;i++){ if(student1[i].score>student1[i+1].score){ student2 = student1[i]; student1[i] = student1[i+1]; student1[i+1] = student2; } } } //打印出各学生的信息 cout<<"输出各学生信息:"<<endl; for(i=0;i<n;i++) { cout<<student1[i].num<<" " <<student1[i].name<<" " <<student1[i].score<<" " <<endl; } cout<<"总成绩:"<<sum<<" " <<"平均成绩"<<average <<endl; return 0; } 结果实验2、“小小计算器”扩展功能实现(2)扩充小小计算器功能:<1> “23 学生成绩普涨10分” d盘根目录下存在一个文本文件my.txt,里面存放了10个学生的成绩,一行一个成绩,从文件中读取学生的成绩,每个成绩都加10分后,保存到原文件中。提示: 注意d:\my.txt在fopen中如何表示;—> “d:\my.txt” 文件打开方式 —> r+ 从文件中读取数据,直到文件结束,如何判断文件结束—> feof() 将增加10后的数据保存到原文件时,要保证从文件头开始,如何使文件指针回到文件头—> rewind() 在写数据时,一定要避免在最后一个数据写完后,再写一个回车,否则下次在操作时可能出错。代码#include <stdio.h> #include <stdlib.h> #define N 10 struct Student { int num; char name[10]; double score; }; int main() { FILE *fp; struct Student stu[N]; int i; fp=fopen("d:\\my.txt","r+"); if(fp==NULL) { printf ("文件打开失败!\n"); exit(1); } printf("打开读取文件,内容是:\n"); i=0; while(1) { if(feof(fp)) break; fscanf(fp,"%d\t%s\t%lf\n",&stu[i].num,stu[i].name,&stu[i].score); printf("%d\t%s\t%.2f\n",stu[i].num,stu[i].name,stu[i].score); i++; } rewind(fp); for(i=0;i<N-1;i++) { fprintf(fp,"%d\t%s\t%.2f\n",stu[i].num,stu[i].name,stu[i].score+10); } fprintf(fp,"%d\t%s\t%.2f",stu[N-1].num,stu[N-1].name,stu[N-1].score+10); fclose(fp); return 0; }结果解决问题:中文乱码可以看到,虽然读取成功但是出现了中文乱码,根据以往经验,应该是编码方式问题!可以看到编码为UTF-8将其改为ANSI在运行一下,看看结果读取没问题,看看写入完美解决!
小小计算器实验1、“小小计算器”基本功能实现(1)编写程序,在屏幕上输出以下内容: ************************** * 小小计算器 * **************************实验2、“小小计算器”基本功能实现(2)编程实现以下功能:① 在屏幕上输出 *********************************** * 小小计算器 * * 1 加法 * * 2 减法 * * 3 乘法 * * 4 除法 * * 5 取模运算 * * 6 计算圆面积 * ***********************************② 定义几个变量,并赋初值,分别进行加法、加法、乘法、除法、取模运算; ③ 定义常量PI等于3.14, 计算给定半径的圆面积,将计算结果分别赋值给一个double类型和int类型的变量,掌握C中的数据类型转换,并将各个计算结果在屏幕上输出。验收/测试用例 假设程序中定义变量并赋初始值如下: int a=8, b=2, c=0, r=2; double t;程序运行后,在屏幕上输入如下:a+b的结果是:10 a-b的结果是:6 a*b的结果是:16 a/b的结果是:4 圆面积整数结果是12 圆面积是12.560000实验3、“小小计算器”基本功能实现(3)在实验2的基础上,实现用cin从键盘上输入数据,进行相应的运算,并将结果在屏幕上输出。要求实现加法、减法和取模运算时,输入数据类型为整数,并将运算结果的10进制、8进制和16进制形式输出;乘法、除法运算的输入数据均为float,计算结果分别以小数形式和指数形式输出;求圆面积输入的数据类型为double,正常输出结果,同时还要求在输出要求保留两位小数的结果。在实验过程中,要求结合课本把cin和cout的各种形式的格式控制都要练习到,从而掌握这两个函数的使用。 验收/测试用例 加法输入: 5, 15输出: 加法结果的十进制形式是:20 加法结果的八进制形式是:24加法结果的十六进制形式是:14 减法输入: 5, 15输出: 减法结果的十进制形式是:-10 减法结果的八进制形式是:3777777766减法结果的十六进制形式是:fffffff6 取模输入: 10, 7输出: 取模结果的十进制形式是:3 取模结果的八进制形式是:3取模结果的十六进制形式是:3 乘法输入: 2000.5,6输出: 乘法结果的小数形式是:12003.000000 乘法结果的指数形式是:1.200300e+004 除法输入: 120,6输出: 除法结果的小数形式是:20.000000 除法结果的指数形式是:2.000000e+001 求圆面积输入: 2输出: 该圆面积是12.560000该圆面积保留两位小数的结果是12.56实验4、小小计算器”基本功能实现(4)编程实现以下功能:① 在屏幕上输出 *********************************** * 小小计算器 * * 1 加法 * * 2 减法 * * 3 乘法 * * 4 除法 * * 5 判断数字的位数 * * 6 计算圆面积 * ***********************************② 除法运算时,如果输入的第二个数(除数)为0,给出提示,显示计算结果。③ 输入一个正整数,要求在三位以内(含三位),求出这个数是几位数,并输出每一位数字。验收/测试用例 除法输入: 120,6输出: 除法结果是:20.000000输入: 120,0输出: 除数为0,无法进行除法运算 判断数字的位数输入: -120输出: 要求输入的数为整数输入: 1000输出: 要求输入的数为3位以内的正整数输入: 123输出: 该数为3位数,百位是1,十位是2,个位是3 输入: 78输出: 该数为2位数,十位是7,个位是8实验5、“小小计算器”基本功能实现(5)① 在“小小计算器”基本功能实现(4) 的基础上,用switch多分枝语句进行计算器操作选择,根据菜单提示,输入一个数字,进行对应的操作。② 扩充计算器功能,添加判断输入的年是否是闰年7 判断闰年 *③ 扩充计算器功能,添加成绩转换功能8 成绩转换 *从键盘上输入一个百分制的成绩,输出对应的等级成绩。100 — 90 ——> 优秀80 — 89 ——> 良70 — 79 ——> 中60 — 69 ——> 及格0 — 59 ——> 不及格验收/测试用例 判断闰年输入:2000输出:2000年是闰年输入:2013输出:2000年是平年 成绩转换输入:-10或101输出:成绩输入错误输入:88输出:良实验6、“小小计算器”基本功能实现(6)编程实现以下功能:① 在屏幕上输出 *********************************** 小小计算器 1 加法 2 减法 3 乘法 4 除法 5 判断数字的位数 6 计算圆面积 7 判断闰年 8 成绩转换 9 计算从1到输入数之间的奇数和 (for) 10 计算从1到输入数之间的偶数和 (while) 11 输出从1到输入数之间所有3的倍数 (do-while) 12 求即被3整除又被5整除的数 13 求水仙花数 14 退出 ***********************************② 利用循环语句,将实验5“小小计算器”基本功能实现(5)改造只有选择退出操作,程序才结束,否则执行一个操作后,提示用户进行下一个操作的输入;③ 增加功能:<1>“ 9 计算从1到输入数之间的奇数和 (for)”从键盘上输入一个正整数,输出1到该数之间所有奇数和。要求用for循环语句实现。<2> “10 计算从1到输入数之间的偶数和 (while)”从键盘上输入一个正整数,输出1到该数之间所有偶数和。要求用while语句实现。<3> “11 输出从1到输入数之间所有3的倍数 (do-while)”从键盘上输入一个正整数,输出1到该数之间所有3的倍数。要求用do-while实现。<4> “12 求即被3整除又被5整除的数”从键盘上输入两个数,输出两个数之间第一个即被3整除又被5整除的数。<5> “13 求水仙花数” 输出所有水仙花数。水仙花数是一个3位数,各位数字的立方之和等于他本身,例如:153= 13+53+33。 实验7、“小小计算器”基本功能实现(7)在实验6的基础上,将小小计算器中的各个操作抽取成函数,在switch语句中,根据输入的操作,调用对应的函数。扩充小小计算器的功能 <1> “14 求最大值” 编写一个带两个参数的函数,该函数返回这两个参数的最大值。输入两个整数,输出他们的最大值。 <2> “15 求最大最小值” 编写一个带两个参数的函数,该函数能求出这两个数的最大值和最小值,使得第一个参数存放最大值,第二个参数存放最小值。要求练习传递地址的参数。实验8、“小小计算器”基本功能实现(8)在实验7 “小小计算器”基本功能实现(7)的基础上,扩充以下功能:<1> “16 冒泡排序” 从键盘上输入10个数,进行冒泡排序,输出排序结果。<2> “17 矩阵转置”从键盘输入一个3X4的整数矩阵,进行转置操作,并将转置结果在屏幕上输出;<3> “18 求对角线和” 从键盘输入一个3*3整数矩阵,求主对角线元素和;<4> “19 统计单词个数”从键盘输入一行字符,单词之间用空格分隔开,统计其中有多少个单词, 并输出结果。实验9、“小小计算器”基本功能实现(9)在实验8 “小小计算器”基本功能实现(8)的基础上,扩充以下功能:<1> “19 统计单词个数”从键盘输入一行字符,单词之间用空格分隔开,统计其中有多少个单词, 并输出结果。实验10、“小小计算器”基本功能实现(10)在实验8的基础上,将功能“16 冒泡排序”的排序结果用指针形式来输出。扩充功能:<1> “20 静态创建链表”静态创建一个包含有4个节点的单链表,输出这个链表的所有数据。节点包含两个域:数据域(int型),指针域。<2> “21 动态创建链表”动态创建一个链表,依次从键盘上输入正整数,将输入的整数插入到该链表中,直到输入一个负数为止。最后将该链表中的数据在屏幕上输出。最终代码:#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<malloc.h> #include<assert.h> using namespace std; #define PI 3.1415926f #define SIZE 20 int GetMax(int m,int n) { if(m>=n) return m; else return n; } int fun1(int *a) { int i, b, max; max = a[0]; // 先让最大值为a[0] for (i = 0; i < 2; i++) // for的目的就是比较出最大值,把最大值付给b { if (a[i] >= max) b = a[i]; } return b; // 反回最大值 } int fun2(int *a) { int i, c, min; min = a[0]; // 先让最小值为a[0] for (i = 0; i < 2; i++) // for的目的就是比较出最小值,把最小值付给c { if (a[i] <= min) c = a[i]; } return c; // 反回最小值 } struct Node { int member; //节点中的成员 struct Node *next; //指向下一个节点的指针 }; //创建单链表的函数 Node* CreateSList() { int i = 0; //循环计数 int length = 0; //链表长度 int value = 0; //存储输入的节点成员值 //创建链表头节点并分配空间 Node* pHead = (Node*)malloc(sizeof(Node)); assert(pHead != NULL); //创建临时节点并分配空间,用于循环控制 Node* pTemp = (Node*)malloc(sizeof(Node)); assert(pHead != NULL); //输入需要创建的链表节点个数 printf("请输入要创建的节点个数:"); scanf("%d", &length); //循环创建链表节点 for (i = 0; i < length; i++) { //输入每个节点的成员 printf("请输入第%d个节点的成员:",i + 1); scanf("%d", &value); //创建一个新节点,并分配空间 Node* pNew = (Node*)malloc(sizeof(Node)); //将刚才输入的节点成员赋给pNew节点 pNew->member = value; //将pNew的下一个节点设置为NULL pNew->next = NULL; //如果是第一个链表节点 if (0 == i) { pHead = pNew; //将pNew节点赋给头节点 pHead->next = NULL; //设置头节点的下一个节点为NULL pTemp = pHead; //将头结点赋给临时节点,用于后面的循环控制 } //不是第一个节点 else { pTemp->next = pNew; //将pNew赋给pTemp节点的下一个节点 pTemp = pTemp->next;//将pTemp指向pTemp的下一个节点 pTemp->next = NULL; //将pTemp的下一个节点的下一个节点设置为NULL } } return pHead;//返回头节点 } //遍历打印链表的函数 void TraversalSList(Node* pHead) { Node* pTemp = pHead; //将头节点的指针赋给临时节点pTemp int i = 0; //循环时打印节点个数的控制变量 while (NULL != pTemp) //若节点pTemp不为空,则循环 { printf("第%d个节点信息:\n", i + 1); printf("第%d个节点的成员值为:%d\n",i + 1,pTemp->member); //节点数累加 i++; //将pTemp指向pTemp的下一个节点 pTemp = pTemp->next; } return; } int jiafa() { int a,b; printf("Input two integers:"); scanf("%d%d",&a,&b); printf("%d+%d=%d\n",a,b,a+b); } int jianfa() { int a,b; printf("Input two integers:"); scanf("%d%d",&a,&b); printf("%d-%d=%d\n",a,b,a-b); } int chengfa() { int a,b; printf("Input two integers:"); scanf("%d%d",&a,&b); printf("%d×%d=%d\n",a,b,a*b); } int chufa() { float a,b; printf("Input two integers:"); scanf("%f%f",&a,&b); printf("%.1f÷%.1f=%.5f\n",a,b,a/b); } int weishu(){ void num(int a); long a; scanf("%ld",&a); num( a); }void num(int a) { long b=0; int i; for(i=0;a>0;a/=10,i++) { b=(b*10)+a%10; } printf("%d位的,逆序数=%ld\n",i,b); } int juanmianji(){ float r,area; printf("请输入圆的半径:"); scanf("%f",&r); area=PI*r*r; printf("圆的面积为:%f",area); } int runnian(){ int a; printf("输入年份:"); scanf("%d",&a); if(a%4==0&&a%100!=0||a%400==0) printf("%d年是闰年\n",a); else printf("不是闰年\n"); } int chengji(){ int s,y; y=(int)(s/10); printf("Input Score:"); scanf("%d",&s); switch(y) { case 9:case 10: printf("%d的等级为优秀",s);break; case 8: printf("%d的等级为良",s);break; case 7: printf("%d的等级为中",s);break; case 6: printf("%d的等级为及格",s);break; default: printf("%d的等级为不及格",s); } } int jishuhe(){ int i,n; int result=0; printf("请输入n:"); scanf("%d",&n); for(i=1; i<=n; i++) { if(i%2==1) result += i; } printf("奇数和为:%d\n",result); return 0; } int oushuhe(){ int n; int i=0,result=0; printf("请输入n:"); scanf("%d",&n); while(i<=n){ i+=2; result += i; } printf("偶数和为:%d\n",result); return 0; } int beishu(){ int n; int i=1; printf("请输入n:"); scanf("%d",&n); do{ if(3*(i+1)) printf("%d,",3*i); i++; }while(3*i<=n); } int zhengchu(){ int a,b,i; printf("Input two integers:"); scanf("%d%d",&a,&b); for(i=a;i<b;i++){ if((i%3==0)&&(i%5==0)){ printf("%d",i); break; } } } int huashu(){ int hun, ten, ind, n; printf("result is:"); for( n=100; n<1000; n++ ) { hun = n / 100; ten = (n-hun*100) / 10; ind = n % 10; if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) printf("%d ", n); } printf("\n"); return 0; } int zuida(){ int x,y,max; printf("Inputx,y:"); scanf("%d%d",&x,&y); max=GetMax(x,y); printf("max=%d\n",max); return 0; } int zuidazuixiao(){ int i, a[2]; printf("input two counts:"); for (i = 0; i < 2; i++) scanf("%d", &a[i]); printf("max is %d\n", fun1(a)); printf("min is %d", fun2(a)); } int paixu(){ int a[10]; int i, j, t; cout<<"inpur 10 numbers:"<<endl; for(i = 0; i < 10; i++)//输入a[0]到a[9] { cin>>a[i]; } cout<<endl; for(j = 1; j <= 9; j++)//共进行9轮比较 { for(i = 0; i < 10; i++)//在每轮中进行(10-j)次比较 if(a[i] > a[i+1])//把每两个数中较小的一个移到靠前的地方 { t = a[i]; a[i] = a[i+1]; a[i+1] = t; } } cout<<"the sorted numbers:"<<endl; for(i = 0; i < 10; i++)//输出10个数 { cout<<"a["<<i<<"] = "<<a[i]<<", "; } cout<<endl; return 0; } int zhuanzhi(){ int i,j,i1,j1,a[101][101],b[101][101]; printf("please input the number of rows(<=100)\n"); scanf("%d",&i1); printf("please input the number of columns(<=100)\n"); scanf("%d",&j1); printf("please input the element\n"); for(i=0;i<i1;i++) for(j=0;j<j1;j++) scanf("%d",&a[i][j]); printf("array a:\n"); for(i=0;i<i1;i++) { for(j=0;j<j1;j++) printf("\t%d",a[i][j]); printf("\n"); } for(i=0;i<i1;i++) for(j=0;j<j1;j++) b[j][i]=a[i][j]; printf("array b:\n"); for(i=0;i<j1;i++) { for(j=0;j<i1;j++) printf("\t%d",b[i][j]); printf("\n"); } return 0; } int duijiaohe(){ #define N 3 int a[N][N],i,j,sum=0; for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); for(i=0;i<N;i++) sum=sum+(a[i][i]+a[i][N-1-i]); printf("%d\n",sum); } int dachigeshu(){ char str[SIZE]={'\0'}; int count=0; printf("plz input the string\n"); gets(str); puts(str); int length = strlen(str); for (int i=0;i<length;i++) { if(str[i]!=' ') { count++; while(str[i]!=' '&&str[i]!='\0') { i++; } } } printf("%d\n",count); return 0; } int jinglianbiao(){ Node* pHead = NULL; //创建链表的头结点,并初始化为NULL pHead = CreateSList(); //调用CreateSList函数创建单链表 printf("\n开始打印全部节点:\n"); TraversalSList(pHead); //调用TraversalSList函数遍历打印单链表 return 0; } Node* CreateSList2() { int i = 0; int length = 0; int value = 0; Node* pHead = (Node*)malloc(sizeof(Node)); Node* pTemp = (Node*)malloc(sizeof(Node)); Node* pNew = (Node*)malloc(sizeof(Node)); printf("请输入第1个节点的成员:"); scanf("%d", &pNew->member); if (0 == pNew->member) { printf("第一个节点的成员就是0,故无法创建该链表!\n"); return NULL; } //while循环,当节点成员不为0时创建 while (0 != pNew->member) { if (0 == i) { pHead = pNew; pHead->next = NULL; pTemp = pHead; } else { pTemp->next = pNew; pTemp = pTemp->next; pTemp->next = NULL; } i++; pNew = (Node*)malloc(sizeof(Node)); printf("请输入第%d个节点的成员:", i + 1); scanf("%d", &pNew->member); } printf("第%d个节点的成员为0,故该链表长度为%d\n", i + 1, i); return pHead; } void TraversalSList2(Node* pHead) { Node* pTmp = pHead; //将头节点的指针赋给临时节点pTemp int i = 0; //循环时打印节点个数的控制变量 while (NULL != pTmp) //节点p不为空,循环 { printf("第%d个节点信息:\n", i + 1); printf("第%d个节点的成员值为:%d\n", i + 1, pTmp->member); i++; pTmp = pTmp->next; } return; } int donglianbiao(){ Node* pHead = NULL; pHead = CreateSList2(); printf("\n开始打印全部节点:\n"); TraversalSList2(pHead); return 0; } int main() { int a,b,c,d; printf("***********************************\n* 小小计算器 *\n* 1 加法 *\n* 2 减法 *\n* 3 乘法 *\n* 4 除法 *\n* 5 取模运算 *\n* 6 计算圆面积 *\n* 7 判断闰年 *\n* 8 成绩转换 *\n* 9 计算从1到输入数之间的奇数和 (for)*\n* 10 计算从1到输入数之间的偶数和 (while)*\n* 11 输出从1到输入数之间所有3的倍数 (do-while)*\n* 12 求即被3整除又被5整除的数*\n* 13 求水仙花数*\n* 14 求最大值*\n* 15 求最大最小值*\n* 16 冒泡排序*\n* 17 矩阵转置*\n* 18 求对角线和*\n* 19 统计单词个数*\n* 20 静态创建链表*\n* 21 动态创建链表*\n* 22 退出*\n***********************************\n\n"); while(1){ printf("Chose an order:"); scanf("%d",&a); switch(a){ case 1:jiafa();break; case 2:jianfa();break; case 3:chengfa();break; case 4:chufa();break; case 5:weishu();break; case 6:juanmianji();break; case 7:runnian();break; case 8:chengji();break; case 9:jishuhe();break; case 10:oushuhe();break; case 11:beishu();break; case 12:zhengchu();break; case 13:huashu();break; case 14:zuida();break; case 15:zuidazuixiao();break; case 16:paixu();break; case 17:zhuanzhi();break; case 18:duijiaohe();break; case 19:dachigeshu();break; case 20:jinglianbiao();break; case 21:donglianbiao();break; case 22:return 0; } } return 0; } 有用的话点个赞吧!
一、Leetcode刷题之两数之和1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] ==9 ,返回 [0, 1] 。 示例 2:输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3:输入:nums = [3,3], target = 6 输出:[0,1] 提示:2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109 只会存在一个有效答案 进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?2.原题链接来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/two-sum二、解题报告思路1循环枚举1.思路分析思路: 提示:首先想到的是 双重循环遍历数组中的每一个数,枚举出两个数可组成的所有组合,判断组合中两个数相加是否等于target,如果等于就输出下标。例如[0,1,2,3]0,10,20,31,21,32,3所有组合2.代码详解class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ for i in range(1,len(nums)): for n in range(i): if nums[n] +nums[i] == target: return [n,i]不过有些不清晰,简单修饰后class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ l = len(nums) for i in range(l): for n in range(i+1,l): if nums[i] +nums[n] == target: return [n,i]3.按步骤分析提示: l = len(nums) 求出数组长度 for i in range(l): 第一个数从下标为0开始,遍历所有数 for n in range(i+1,l): 第一个数从下标为i+1开始,就是读取下标为i+1后面的数 if nums[i] +nums[n] == target: 判断两个数是否相加为target return n,i 返回下标思路2字典模拟哈希表1.思路分析这次我们不找两个数,找一个数,如果第一个数为x,那么y就等于target-x,我们只需找到y是否在列表中,如果在就输出下标。class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ l = len(nums) for i in range(l): y = target - nums[i] for n in range(i+1,l): if nums[n] == y: return [n,i]但是这样还是需要双重循环,没有太大区别!接下来就用到了字典。enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标.例如nums = [10,20,30]print(enumerate(nums))结果:(0 ,10)(1 ,20)(2 ,30)2.代码详解class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ dict = {} for v, k in enumerate(nums): n = target - k if n in dict: return [dict[n], v] else: dict[k] = v3.按步骤分析dict = {}建一个空字典 for v, k in enumerate(nums): 循环遍历,为v和k赋值,v为下标,k为数值 n = target - k 求数n if n in dict: return [dict[n], v] 判断数n是否在字典中,如果在就返回下标。 else: dict[k] = v 这一步是将遍历过的数和其下标,添加到字典里。因为刚开始字典为空,所以会将两个数中的第一个数添加字典中k代表的字典的key,v代表字典的value,当遍历第二个数时,查询第一个数在字典中,返回这两个数的>下标!回文数给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121 输出:true 示例 2:输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。 因此它不是一个回文数。 示例3:输入:x = 10 输出:false 解释:从右向左读, 为 01 。 因此它不是一个回文数。提示:-231 <= x <= 231 - 1进阶:你能不将整数转为字符串来解决这个问题吗?来源:力扣(LeetCode)链接:https://leetcode.cn/problems/palindrome-number做题思路将整数转为字符串,然后用字符串切片逆序输出,比较两者是否相同,如果相同就返回ture,否者返回false。解题步骤1.将整数转为字符串s = str(x)2.字符串切片逆序输出s[::-1]3.比较两者是否相同,如果相同就返回true,否者返回false。if s == s[::-1]: return True else: return False代码整合class Solution(object): def isPalindrome(self, x): """ :type x: int :rtype: bool """ s = str(x) if s == s[::-1]: return True else: return False进阶你能不将整数转为字符串来解决这个问题吗?做题思路官方题解方法一:反转一半数字思路映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。但是,如果反转后的数字大于 \text{int.MAX}int.MAX,我们将遇到整数溢出问题。按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 \text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。算法首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。现在,让我们来考虑如何反转后半部分的数字。对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。作者:LeetCode-Solution链接:https://leetcode.cn/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/来源:力扣(LeetCode)解题步骤根据官方给的题解用Python实现一下总的来说就是翻转一半的数字,即后半部分。1.首先将小于0或者能被10整除的整数(不包括0)返回false大于等于0并且小于10的整数(0到9都是回文数) 返回trueif x < 0 or (x % 10 == 0 and x != 0): return False if x < 10 and x >= 0: return True 2.翻转后半部分数字y = 0 while x > y: y = y * 10 + x % 10 x //= 10x % 10取余x //= 10取整3.判断是否相同 if x == y: return True else: return False但是当x为奇数时会出现翻转后会多一个0,例如111翻转后为1110因此需加上多一个判断条件,x == y // 10又因为0到9也是奇数翻转后多一个0所以可略去判断 x < 10 and x >= 0代码整合class Solution(object): def isPalindrome(self, x): """ :type x: int :rtype: bool """ if x < 0 or (x % 10 == 0 and x != 0): return False y = 0 while x > y: y = y * 10 + x % 10 x //= 10 if x == y or x == y // 10: return True else: return False
6061. 买钢笔和铅笔的方案数给你一个整数 total ,表示你拥有的总钱数。同时给你两个整数 cost1 和 cost2 ,分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱,去买任意数目的两种笔。请你返回购买钢笔和铅笔的 不同方案数目 。示例 1:输入:total = 20, cost1 = 10, cost2 = 5 输出:9 解释:一支钢笔的价格为 10 ,一支铅笔的价格为 5 。如果你买 0 支钢笔,那么你可以买 0 ,1 ,2 ,3 或者 4 支铅笔。如果你买 1 支钢笔,那么你可以买 0 ,1 或者 2 支铅笔。如果你买 2 支钢笔,那么你没法买任何铅笔。 所以买钢笔和铅笔的总方案数为 5 + 3 + 1 = 9 种。示例 2:输入:total = 5, cost1 = 10, cost2 = 10 输出:1 解释:钢笔和铅笔的价格都为 10,都比拥有的钱数多,所以你没法购买任何文具。所以只有 1 种方案:买 0 支钢笔和 0 支铅笔。提示:1 <= total, cost1, cost2 <= 106来源:力扣解题思路:第一步,光买钢笔有几种方案 a = int(total/cost1)+1因为0只钢笔也算一种方案,所以加一第二步,买钢笔后,剩下的钱能购买多少铅笔int((total-cost1*n)/cost2)第三步,在买钢笔的几种方案下,剩下的钱购买铅笔有几种方案for n in range(a): int((total-cost1*n)/cost2)+1第四步,将所有方案相加b = 0 for n in range(a): b += int((total-cost1*n)/cost2)+1代码整合:class Solution(object): def waysToBuyPensPencils(self, total, cost1, cost2): """ :type total: int :type cost1: int :type cost2: int :rtype: int """ a = int(total/cost1)+1 b = 0 for n in range(a): b += int((total-cost1*n)/cost2)+1 return b6060. 找到最接近 0 的数字给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。示例 1:输入:nums = [-4,-2,1,4,8] 输出:1 解释:-4 到 0 的距离为 |-4| = 4 。-2 到 0 的距离为 |-2| = 2 。 1 到 0 的距离为 |1| = 1 。 4 到 0 的距离为 |4| = 4 。 8 到 0 的距离为 |8| = 8 。 所以,数组中距离 0 最近的数字为 1 。示例 2:输入:nums = [2,-1,1] 输出:1 解释:1 和 -1 都是距离 0 最近的数字,所以返回较大值 1 。提示:1 <= n <= 1000-105 <= nums[i] <= 105解题思路:第一步,求出每个数到0的距离for i in nums: n.append(abs(i-0))第二步,最小距离的索引值m = [x for x ,y in list(enumerate(n)) if y ==min(n)]第三步,距离0最近的数字for k in m: p.append(nums[k])第四步,返回较大值return max(p)代码整合:class Solution(object): def findClosestNumber(self, nums): """ :type nums: List[int] :rtype: int """ n = [] p = [] m = [] for i in nums: n.append(abs(i-0)) m = [x for x ,y in list(enumerate(n)) if y ==min(n)] for k in m: p.append(nums[k]) return max(p) 优化后:class Solution(object): def findClosestNumber(self, nums): """ :type nums: List[int] :rtype: int """ nums.sort(key = lambda x : (abs(x), -x)) return nums[0]
罗马数字转整数罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。给定一个罗马数字,将其转换成整数。示例 1:输入: s = "III" 输出: 3示例 2:输入: s = "IV" 输出: 4示例 3:输入: s = "IX" 输出: 9示例 4:输入: s = "LVIII" 输出: 58解释: L = 50, V= 5, III = 3.示例 5:输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.提示:1 <= s.length <= 15s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。来源:力扣(LeetCode) 链接:13罗马数字转整数解题思路:初始值为零,从左往右遍历,如果遍历当前的这个罗马数比下一位的小就减去这个罗马数,否则就加上。例如: IV = 0-1+5 LVIII = 0+50+5+1+1+1由此可见无论是奇数还是偶数,最后一位数无论大小都是加上!解题步骤:第一步,建立一个字典,key为罗马数,value为对应的十进制数n = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}第二步,设初始值为零sum = 0第三步,遍历sfor i in range(len(s))第四步,比较当前遍历位和下一位的大小if n[s[i]]<n[s[i+1]] 或者 if n[s[i]]>=n[s[i+1]]第五步,如果小于就减去这个数,否则就加上if n[s[i]]<n[s[i+1]]: sum -= n[s[i]] else: sum += n[s[i]] 或者 if n[s[i]]>=n[s[i+1]]: sum += n[s[i]] else: sum -= n[s[i]]第六步,由于无论是奇数还是偶数,最后一位数无论大小都是加上,所以多加一个判断条件,最后一位直接加上if i<len(s)-1 and n[s[i]]<n[s[i+1]]: sum -= n[s[i]] else: sum += n[s[i]] 或者 if i<len(s)-1 and n[s[i]]>=n[s[i+1]] or i = len(s)-1: sum += n[s[i]] else: sum -= n[s[i]]代码整合:class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ n = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} sum = 0 for i in range(len(s)): if i<len(s)-1 and n[s[i]]<n[s[i+1]]: sum -= n[s[i]] else: sum += n[s[i]] return sum 1. 宝石补给欢迎各位勇者来到力扣新手村,在开始试炼之前,请各位勇者先进行「宝石补给」。 每位勇者初始都拥有一些能量宝石, gem[i] 表示第 i 位勇者的宝石数量。现在这些勇者们进行了一系列的赠送,operations[j] = [x, y] 表示在第 j 次的赠送中 第 x 位勇者将自己一半的宝石(按需向下取整)赠送给第 y 位勇者。在完成所有的赠送后,请找到拥有最多宝石的勇者和拥有最少宝石的勇者,并返回他们二者的宝石数量之差。注意:赠送将按顺序逐步进行。示例 1:输入:gem = [3,1,2], operations = [[0,2],[2,1],[2,0]]输出:2解释: 第 1 次操作,勇者 0 将一半的宝石赠送给勇者 2, gem = [2,1,3] 第 2 次操作,勇者 2 将一半的宝石赠送给勇者1, gem = [2,2,2] 第 3 次操作,勇者 2 将一半的宝石赠送给勇者 0, gem = [3,2,1] 返回 3 - 1 =2示例 2:输入:gem = [100,0,50,100], operations = [[0,2],[0,1],[3,0],[3,0]]输出:75解释: 第 1 次操作,勇者 0 将一半的宝石赠送给勇者 2, gem = [50,0,100,100] 第 2 次操作,勇者 0将一半的宝石赠送给勇者 1, gem = [25,25,100,100] 第 3 次操作,勇者 3 将一半的宝石赠送给勇者 0, gem =[75,25,100,50] 第 4 次操作,勇者 3 将一半的宝石赠送给勇者 0, gem = [100,25,100,25] 返回100 - 25 = 75示例 3:输入:gem = [0,0,0,0], operations = [[1,2],[3,1],[1,2]]输出:0提示:2 <= gem.length <= 10^3 0 <= gem[i] <= 10^3 0 <= operations.length <=10^4 operations[i].length == 2 0 <= operationsi,operationsi< gem.length来源:力扣宝石补给解题思路:第一步赠送宝石,小数时向下取整for i in operations: gem[i[1]] = gem[i[1]] + int(gem[i[0]]/2) gem[i[0]] = gem[i[0]] - int(gem[i[0]]/2)第二步:冒泡排序for j in range(len(gem)-1): for m in range(len(gem)-1-j): if gem[m]<gem[m+1]: gem[m],gem[m+1] = gem[m+1],gem[m]第三步:最大和最小两者之差n=gem[0]-gem[len(gem)-1]✅✅✅代码整合:class Solution(object): def giveGem(self, gem, operations): """ :type gem: List[int] :type operations: List[List[int]] :rtype: int """ for i in operations: gem[i[1]] = gem[i[1]] + int(gem[i[0]]/2) gem[i[0]] = gem[i[0]] - int(gem[i[0]]/2) for j in range(len(gem)-1): for m in range(len(gem)-1-j): if gem[m]<gem[m+1]: gem[m],gem[m+1] = gem[m+1],gem[m] n=gem[0]-gem[len(gem)-1] return n通过:能力有限,短时间内没想到最优解就提交了,如果有更好的欢迎分享!
大概要求:1、数据库,是给定的原始数据集合;2、挖掘数据库“关系详情”中的“夫妻/配偶、兄弟姐妹、父子、父女、母子、母女”具体信息;3、挖掘后的信息整理成【示例】中的格式;注意:1)一个证券代码对应多个年份;2)该证券代码下的公司存在某种类型的关系标记为1,不存在对应关系标记为0。3)按照年份统计不同类型的亲缘关系在上市公司中的分布和趋势【可视化呈现-自由选择方式】。数据:我看了一下大概十几万条!原本想简单用Python跑了一下,看看效果,但是几分钟也没出结果就放弃了!(原因自己技术不到家)于是就用Excel表做数据挖掘。方法:第一步:提取年份。新建一个年份列,点击年份下的空格,输入函数=YEAR(B2)提取统计截止日期中的年份下面的十字快速双击就行了,年份这一列就完成了!第二步,判断持股人之间的关系在关系列下的空格中输入函数=IF(OR(ISNUMBER(FIND({"哥","弟","兄","姐","妹"},J2))),1,0)判断关系详情中是否包含哥或第或姐或妹等字符,如果包含就为1,不包含就为0其他的类似分别输入对应的函数=IF(OR(ISNUMBER(FIND({"夫妻","丈夫","妻子"},J2))),1,0)夫妻=IF(AND(ISNUMBER(FIND({"父","子"},J2))),1,0)父子=IF(AND(ISNUMBER(FIND({"父","女"},J2))),1,0)父女=IF(AND(ISNUMBER(FIND({"母","子"},J2))),1,0)母子=IF(AND(ISNUMBER(FIND({"母","女"},J2))),1,0)母女因为数据量大,没有一一看,可能有些类似谁是谁的长子,谁是谁的女婿等未提取出这样持股人之间的关系就提取出来了。第三步,制作统计表同样我们也用函数!按照年份统计每一年持股人不同的关系的总数在每一列关系下的第一个空,分别输入以下函数=SUMIF(C2:C199673,T2,L2:L199673)=SUMIF(C2:C199673,T2,K2:K199673)=SUMIF(C2:C199673,T2,M2:M199673)=SUMIF(C2:C199673,T2,N2:N199673)=SUMIF(C2:C199673,T2,O2:O199673)=SUMIF(C2:C199673,T2,P2:P199673)函数功能,判断年份列中的年份是否等于对应的年份,如果等于就将对应行中的关系相加求和结果:第四步,制作图表原本到这里就完成,不过觉得如果做成动态的会更加有趣!但是用代码敲的话,有些麻烦,并需要一些编程基础。推荐一个在线制作动图网站Flourish无需编程基础就可以做出漂亮的动态图表首先准备一个Excel表,输入统计表进入网站股权关系动态图表上传数据即可!也可以根据自己的喜好调整颜色,大小等是不是很方便,我朋友觉得很酷!很满意!并且可以发布!可以让别人下载和访问!总结:虽然没有用Python做出来,不过也掌握了Excel的方法!
pytorch人工智能学习需要安装pytorch,今天记录一下自己的安装过程!首先查看自己的Python版本命令行cmd输入Python即可查看结果如下:由此可以看出Python为3.8版本然后先查看CUDA版本进入cmd输入以下nvidia-smi如图CUDA Version 11.6所以我的是11.6版本的在线安装进入官网下载选择对应的版本和安装方式!在cmd输入对应的命令但是下载速度慢,所以可以选择离线安装!离线下载安装pytorch与torchvision下载链接:https://download.pytorch.org/whl/torch_stable.html选择对应版本下载例如:红箭头就是我要下载的两个文件CUDA没有11.6的我选择11.5,Python版本3.8,Windows64位下载完pytorch和torchvision的.whl文件之后,在下载的目录内使用下列命令即可:pip install torch-1.11.0+cu115-cp38-cp38-win_amd64.whlpip install torchaudio-0.11.0+cu115-cp38-cp38-win_amd64.whl安装成功!是否安装成功运行代码看能否使用import torch # 能否调用pytorch库 print(torch.cuda.current_device()) # 输出当前设备(我只有一个GPU为0) print(torch.cuda.device(0)) # <torch.cuda.device object at> print(torch.cuda.device_count()) # 输出含有的GPU数目 print(torch.cuda.get_device_name(0)) # 输出GPU名称 --比如1080Ti x = torch.rand(5, 3) print(x) # 输出一个5 x 3运行成功!
降维算法PCA及其应用利用PCA算法实现手写字体识别,要求:1、实现手写数字数据集的降维;2、比较两个模型(64维和10维)的准确率;3、对两个模型分别进行10次10折交叉验证,绘制评分对比曲线。实验步骤1. 导入数据集from sklearn.datasets import load_digits digits = load_digits() train = digits.data target = digits.target2. 实现手写数字数据集的降维;pca = PCA(n_components=10,whiten=True) pca.fit(x_train,y_train) x_train_pca = pca.transform(x_train) x_test_pca = pca.transform(x_test)3. 比较两个模型(64维和10维)的准确率;64维svc = SVC(kernel = 'rbf') svc.fit(x_train,y_train) y_predict = svc.predict(x_test) print('The Accuracy of SVC is', svc.score(x_test, y_test)) print("classification report of SVC\n",classification_report(y_test, y_predict, target_names=digits.target_names.astype(str)))10维svc = SVC(kernel = 'rbf') svc.fit(x_train_pca,y_train) y_pre_svc = svc.predict(x_test_pca) print("The Accuracy of PCA_SVC is ", svc.score(x_test_pca,y_test)) print("classification report of PCA_SVC\n", classification_report(y_test, y_pre_svc, target_names=digits.target_names.astype(str)))4. 对两个模型分别进行10次10折交叉验证,绘制评分对比曲线。for i in range(100): # 创建子图 plt.subplot(10,10,i+1) # 显示灰度图像 plt.imshow(samples[i].reshape(8,8),cmap='gray') title = str(y_pre[i]) plt.title(title,color='red') # 关闭坐标轴 plt.axis('off') plt.show()代码详解import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split from sklearn.datasets import load_digits digits = load_digits() train = digits.data target = digits.target x_train,x_test,y_train,y_test = train_test_split(train,target,test_size=0.2,random_state=33) ss = StandardScaler() x_train = ss.fit_transform(x_train) x_test = ss.transform(x_test) svc = SVC(kernel = 'rbf') svc.fit(x_train,y_train) y_predict = svc.predict(x_test) print('The Accuracy of SVC is', svc.score(x_test, y_test)) print("classification report of SVC\n",classification_report(y_test, y_predict, target_names=digits.target_names.astype(str))) # 实现手写数字数据集的降维实现手写数字数据集的降维 pca = PCA(n_components=10,whiten=True) pca.fit(x_train,y_train) x_train_pca = pca.transform(x_train) x_test_pca = pca.transform(x_test) svc = SVC(kernel = 'rbf') svc.fit(x_train_pca,y_train) # 比较两个模型(64维和10维)的准确率 y_pre_svc = svc.predict(x_test_pca) print("The Accuracy of PCA_SVC is ", svc.score(x_test_pca,y_test)) print("classification report of PCA_SVC\n", classification_report(y_test, y_pre_svc, target_names=digits.target_names.astype(str))) samples = x_test[:100] y_pre = y_pre_svc[:100] plt.figure(figsize=(12,38)) # 对两个模型分别进行10次10折交叉验证,绘制评分对比曲线 for i in range(100): plt.subplot(10,10,i+1) plt.imshow(samples[i].reshape(8,8),cmap='gray') title = str(y_pre[i]) plt.title(title) plt.axis('off') plt.show()结果:SVCPCA降维算法PCA及其应用手写识别【自定义数据集】利用PCA算法实现手写字体识别,要求:1、实现手写数字数据集的降维;2、比较两个模型(64维和10维)的准确率;3、对两个模型分别进行10次10折交叉验证,绘制评分对比曲线。实验步骤1. 导入自定义数据集可以事先下载,也可以联网下载!下载地址:http://deeplearning.net/data/mnist/保存如下:from pathlib import Path DATA_PATH = Path("data") PATH = DATA_PATH / "mnist" PATH.mkdir(parents=True, exist_ok=True) URL = "http://deeplearning.net/data/mnist/" FILENAME = "mnist.pkl.gz" # 如果未下载,则创建目录下载数据 if not (PATH / FILENAME).exists(): content = requests.get(URL + FILENAME).content (PATH / FILENAME).open("wb").write(content) # 读取数据集 with gzip.open((PATH / FILENAME).as_posix(), "rb") as f: ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding="latin-1") x_train = x_train[:5000,:] y_train = y_train[:5000,] x_test = x_test[:360,:] y_test = y_test[:360,]其他步骤和上一个相同【人工智能之手写字体识别】机器学习及与智能数据处理之降维算法PCA及其应用手写字体识别代码详解import matplotlib.pyplot as plt from pathlib import Path from sklearn.svm import SVC from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report import requests import pickle import gzip DATA_PATH = Path("data") PATH = DATA_PATH / "mnist" PATH.mkdir(parents=True, exist_ok=True) URL = "http://deeplearning.net/data/mnist/" FILENAME = "mnist.pkl.gz" if not (PATH / FILENAME).exists(): content = requests.get(URL + FILENAME).content (PATH / FILENAME).open("wb").write(content) # 读取数据集 with gzip.open((PATH / FILENAME).as_posix(), "rb") as f: ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding="latin-1") x_train = x_train[:5000,:] y_train = y_train[:5000,] x_test = x_test[:360,:] y_test = y_test[:360,] ################################################################# # Each image is 28 x 28, and is being stored as a flattened row of length # 784 (=28x28). Let's take a look at one; we need to reshape it to 2d # first. ss = StandardScaler() x_train = ss.fit_transform(x_train) x_test = ss.transform(x_test) svc = SVC(kernel = 'rbf') svc.fit(x_train,y_train) y_predict = svc.predict(x_test) print('The Accuracy of SVC is', svc.score(x_test, y_test)) print("classification report of SVC\n",classification_report(y_test, y_predict)) samples = x_test[:100] y_pre = y_predict[:100] plt.figure(figsize=(12,38)) for i in range(100): # 创建子图 plt.subplot(10,10,i+1) # 显示灰度图像 plt.imshow(samples[i].reshape(28,28),cmap='gray') title = str(y_pre[i]) plt.title(title,color='red') # 关闭坐标轴 plt.axis('off') plt.show() # 实现手写数字数据集的降维实现手写数字数据集的降维 pca = PCA(n_components=10,whiten=True) pca.fit(x_train,y_train) x_train_pca = pca.transform(x_train) x_test_pca = pca.transform(x_test) svc = SVC(kernel = 'rbf') svc.fit(x_train_pca,y_train) # 比较两个模型(64维和10维)的准确率 y_pre_svc = svc.predict(x_test_pca) print("The Accuracy of PCA_SVC is ", svc.score(x_test_pca,y_test)) print("classification report of PCA_SVC\n", classification_report(y_test, y_pre_svc)) samples = x_test[:100] y_pre = y_pre_svc[:100] plt.figure(figsize=(12,38)) # 对两个模型分别进行10次10折交叉验证,绘制评分对比曲线 for i in range(100): plt.subplot(10,10,i+1) plt.imshow(samples[i].reshape(28,28),cmap='gray') title = str(y_pre[i]) plt.title(title) plt.axis('off') plt.show()结果:SVCPCA
支持向量机实例1.线性核函数def test_SVC_linear(): ''' 测试 SVC 的用法。这里使用的是最简单的线性核 :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) cls=SVC(kernel='linear') cls.fit(X_train,y_train) print('Coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_)) print('Score: %.2f' % cls.score(X_test, y_test))2.多项式核函数def test_SVC_poly(): ''' 测试多项式核的 SVC 的预测性能随 degree、gamma、coef0 的影响. :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=0, stratify=iris.target) fig=plt.figure() ### 测试 degree #### degrees=range(1,20) train_scores=[] test_scores=[] for degree in degrees: cls=SVC(kernel='poly',degree=degree,gamma='auto') cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,1) # 一行三列 ax.plot(degrees,train_scores,label="Training score ",marker='+' ) ax.plot(degrees,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_degree ") ax.set_xlabel("p") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 gamma ,此时 degree 固定为 3#### gammas=range(1,20) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='poly',gamma=gamma,degree=3) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,2) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_gamma ") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 r ,此时 gamma固定为10 , degree 固定为 3###### rs=range(0,20) train_scores=[] test_scores=[] for r in rs: cls=SVC(kernel='poly',gamma=10,degree=3,coef0=r) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,3) ax.plot(rs,train_scores,label="Training score ",marker='+' ) ax.plot(rs,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_r ") ax.set_xlabel(r"r") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() 3.RBF高斯核函数ef test_SVC_rbf(): ''' 测试 高斯核的 SVC 的预测性能随 gamma 参数的影响 :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) gammas=range(1,20) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='rbf',gamma=gamma) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) fig=plt.figure() ax=fig.add_subplot(1,1,1) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_rbf") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() 4.sigmoid核函数def test_SVC_sigmoid(): ''' 测试 sigmoid 核的 SVC 的预测性能随 gamma、coef0 的影响. :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) fig=plt.figure() ### 测试 gamma ,固定 coef0 为 0 #### gammas=np.logspace(-2,1) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='sigmoid',gamma=gamma,coef0=0) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,2,1) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_sigmoid_gamma ") ax.set_xscale("log") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 r,固定 gamma 为 0.01 ###### rs=np.linspace(0,5) train_scores=[] test_scores=[] for r in rs: cls=SVC(kernel='sigmoid',coef0=r,gamma=0.01) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,2,2) ax.plot(rs,train_scores,label="Training score ",marker='+' ) ax.plot(rs,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_sigmoid_r ") ax.set_xlabel(r"r") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() 代码:import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.svm import SVC import matplotlib.pyplot as plt def test_SVC_linear(): ''' 测试 SVC 的用法。这里使用的是最简单的线性核 :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) cls=SVC(kernel='linear') cls.fit(X_train,y_train) print('Coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_)) print('Score: %.2f' % cls.score(X_test, y_test)) def test_SVC_poly(): ''' 测试多项式核的 SVC 的预测性能随 degree、gamma、coef0 的影响. :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=0, stratify=iris.target) fig=plt.figure() ### 测试 degree #### degrees=range(1,20) train_scores=[] test_scores=[] for degree in degrees: cls=SVC(kernel='poly',degree=degree,gamma='auto') cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,1) # 一行三列 ax.plot(degrees,train_scores,label="Training score ",marker='+' ) ax.plot(degrees,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_degree ") ax.set_xlabel("p") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 gamma ,此时 degree 固定为 3#### gammas=range(1,20) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='poly',gamma=gamma,degree=3) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,2) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_gamma ") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 r ,此时 gamma固定为10 , degree 固定为 3###### rs=range(0,20) train_scores=[] test_scores=[] for r in rs: cls=SVC(kernel='poly',gamma=10,degree=3,coef0=r) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,3,3) ax.plot(rs,train_scores,label="Training score ",marker='+' ) ax.plot(rs,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_poly_r ") ax.set_xlabel(r"r") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() def test_SVC_rbf(): ''' 测试 高斯核的 SVC 的预测性能随 gamma 参数的影响 :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) gammas=range(1,20) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='rbf',gamma=gamma) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) fig=plt.figure() ax=fig.add_subplot(1,1,1) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_rbf") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() def test_SVC_sigmoid(): ''' 测试 sigmoid 核的 SVC 的预测性能随 gamma、coef0 的影响. :param data: 可变参数。它是一个元组,这里要求其元素依次为训练样本集、测试样本集、训练样本的标记、测试样本的标记 :return: None ''' iris = datasets.load_iris() X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.25, random_state=0,stratify=iris.target) fig=plt.figure() ### 测试 gamma ,固定 coef0 为 0 #### gammas=np.logspace(-2,1) train_scores=[] test_scores=[] for gamma in gammas: cls=SVC(kernel='sigmoid',gamma=gamma,coef0=0) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,2,1) ax.plot(gammas,train_scores,label="Training score ",marker='+' ) ax.plot(gammas,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_sigmoid_gamma ") ax.set_xscale("log") ax.set_xlabel(r"$\gamma$") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) ### 测试 r,固定 gamma 为 0.01 ###### rs=np.linspace(0,5) train_scores=[] test_scores=[] for r in rs: cls=SVC(kernel='sigmoid',coef0=r,gamma=0.01) cls.fit(X_train,y_train) train_scores.append(cls.score(X_train,y_train)) test_scores.append(cls.score(X_test, y_test)) ax=fig.add_subplot(1,2,2) ax.plot(rs,train_scores,label="Training score ",marker='+' ) ax.plot(rs,test_scores,label= " Testing score ",marker='o' ) ax.set_title( "SVC_sigmoid_r ") ax.set_xlabel(r"r") ax.set_ylabel("score") ax.set_ylim(0,1.05) ax.legend(loc="best",framealpha=0.5) plt.show() if __name__=="__main__": test_SVC_linear() test_SVC_poly() test_SVC_rbf() test_SVC_sigmoid() 结果:线性核函数多项式核函数RBF高斯核函数sigmoid核函数
❤❤❤ID3算法✅✅决策树的思想:给定一个集合,其中的每个样本由若干属性表示,决策树通过贪心的策略不断挑选最优的属性。常见的决策树算法有ID3,C4.5,CART算法等。ID3算法: baseEntropy = self.calcShannonEnt(dataset) # 基础熵 num = len(dataset) # 样本总数 #子集中的概率 subDataSet = self.splitDataSet(dataset, i, val) prob = len(subDataSet) / float(num) # 条件熵 newEntropy += prob * self.calcShannonEnt(subDataSet) # 信息增益 infoGain = baseEntropy - newEntropy1.先写绘图树方法,函数。import matplotlib.pyplot as plt decisionNode = dict(boxstyle="sawtooth", fc="0.8") leafNode = dict(boxstyle="round4", fc="0.8") arrow_args = dict(arrowstyle="<-") def plotNode(nodeTxt, centerPt, parentPt, nodeType): createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction', \ xytext=centerPt, textcoords='axes fraction', \ va="center", ha="center", bbox=nodeType, arrowprops=arrow_args) def getNumLeafs(myTree): numLeafs = 0 firstStr = list(myTree.keys())[0] secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__ == 'dict': numLeafs += getNumLeafs(secondDict[key]) else: numLeafs += 1 return numLeafs def getTreeDepth(myTree): maxDepth = 0 firstStr = list(myTree.keys())[0] secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__ == 'dict': thisDepth = getTreeDepth(secondDict[key]) + 1 else: thisDepth = 1 if thisDepth > maxDepth: maxDepth = thisDepth return maxDepth def plotMidText(cntrPt, parentPt, txtString): xMid = (parentPt[0] - cntrPt[0]) / 2.0 + cntrPt[0] yMid = (parentPt[1] - cntrPt[1]) / 2.0 + cntrPt[1] createPlot.ax1.text(xMid, yMid, txtString) def plotTree(myTree, parentPt, nodeTxt): numLeafs = getNumLeafs(myTree) depth = getTreeDepth(myTree) firstStr = list(myTree.keys())[0] cntrPt = (plotTree.xOff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalw, plotTree.yOff) plotMidText(cntrPt, parentPt, nodeTxt) plotNode(firstStr, cntrPt, parentPt, decisionNode) secondDict = myTree[firstStr] plotTree.yOff = plotTree.yOff - 1.0 / plotTree.totalD for key in secondDict.keys(): if type(secondDict[key]).__name__ == 'dict': plotTree(secondDict[key], cntrPt, str(key)) else: plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalw plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode) plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key)) plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalD def createPlot(inTree): fig = plt.figure(1, facecolor='white') fig.clf() axprops = dict(xticks=[], yticks=[]) createPlot.ax1 = plt.subplot(111, frameon=False, **axprops) plotTree.totalw = float(getNumLeafs(inTree)) plotTree.totalD = float(getTreeDepth(inTree)) plotTree.xOff = -0.5 / plotTree.totalw plotTree.yOff = 1.0 plotTree(inTree, (0.5, 1.0), '') plt.show()2.ID3决策树类class ID3Tree(object): def __init__(self): self.tree = {} # ID3 Tree self.dataSet = [] # 数据集 self.labels = [] # 标签集 def getDataSet(self, dataset, labels): self.dataSet = dataset self.labels = labels def train(self): # labels = copy.deepcopy(self.labels) labels = self.labels[:] self.tree = self.buildTree(self.dataSet, labels) def buildTree(self, dataSet, labels): classList = [ds[-1] for ds in dataSet] # 提取样本的类别 if classList.count(classList[0]) == len(classList): # 单一类别 return classList[0] if len(dataSet[0]) == 1: # 没有属性需要划分了 return self.classify(classList) bestFeat = self.findBestSplit(dataSet) # 选取最大增益的属性序号 bestFeatLabel = labels[bestFeat] tree = {bestFeatLabel: {}} # 构造一个新的树结点 del (labels[bestFeat]) # 从总属性列表中去除最大增益属性 featValues = [ds[bestFeat] for ds in dataSet] # 抽取最大增益属性的取值列表 uniqueFeatValues = set(featValues) # 选取最大增益属性的数值类别 for value in uniqueFeatValues: # 对于每一个属性类别 subLabels = labels[:] subDataSet = self.splitDataSet(dataSet, bestFeat, value) # 分裂结点 subTree = self.buildTree(subDataSet, subLabels) # 递归构造子树 tree[bestFeatLabel][value] = subTree return tree # 计算出现次数最多的类别标签 def classify(self, classList): items = dict([(classList.count(i), i) for i in classList]) return items[max(items.keys())] # 计算最优特征 def findBestSplit(self, dataset): numFeatures = len(dataset[0]) - 1 baseEntropy = self.calcShannonEnt(dataset) # 基础熵 num = len(dataset) # 样本总数 bestInfoGain = 0.0 bestFeat = -1 # 初始化最优特征向量轴 # 遍历数据集各列,寻找最优特征轴 for i in range(numFeatures): featValues = [ds[i] for ds in dataset] uniqueFeatValues = set(featValues) newEntropy = 0.0 # 按列和唯一值,计算信息熵 for val in uniqueFeatValues: subDataSet = self.splitDataSet(dataset, i, val) prob = len(subDataSet) / float(num) # 子集中的概率 newEntropy += prob * self.calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy # 信息增益 if infoGain > bestInfoGain: # 挑选最大值 bestInfoGain = baseEntropy - newEntropy bestFeat = i return bestFeat # 从dataset数据集的feat特征中,选取值为value的数据 def splitDataSet(self, dataset, feat, values): retDataSet = [] for featVec in dataset: if featVec[feat] == values: reducedFeatVec = featVec[:feat] reducedFeatVec.extend(featVec[feat + 1:]) retDataSet.append(reducedFeatVec) return retDataSet # 计算dataSet的信息熵 def calcShannonEnt(self, dataSet): num = len(dataSet) # 样本集总数 classList = [c[-1] for c in dataSet] # 抽取分类信息 labelCounts = {} for cs in set(classList): # 对每个分类进行计数 labelCounts[cs] = classList.count(cs) shannonEnt = 0.0 for key in labelCounts: prob = labelCounts[key] / float(num) shannonEnt -= prob * log2(prob) return shannonEnt # 预测。对输入对象进行ID3分类 def predict(self, tree, newObject): # 判断输入值是否为“dict” while type(tree).__name__ == 'dict': key = list(tree.keys())[0] tree = tree[key][newObject[key]] return tree给出数据集,标签集:dataSet = [[1, 1, 1, 1,1, 1, 'Yes'], [2, 1, 2, 1,1, 1, 'Yes'], [2, 1, 1, 1,1, 1, 'Yes'], [1, 1, 2, 1,1, 1, 'Yes'], [3, 1, 1, 1,1, 1, 'Yes'], [1,2, 1, 1,2, 2, 'Yes'], [2, 2, 1, 2,2, 2, 'Yes'], [2, 2, 1, 1,2, 1, 'Yes'], [2, 2, 2, 2,2, 1, 'No'], [1,3, 3, 1,3, 2, 'No'], [3, 3, 3, 3,3, 1, 'No'], [3, 1, 1, 3,3, 2, 'No'], [1, 2, 1, 2,1, 1, 'No'], [3,2, 2, 2,1, 1, 'No'], [2, 2, 1, 1,2, 2, 'No'], [3, 1, 1, 3,3, 1, 'No'], [1, 1, 2, 2,2, 1, 'No'],] #'色泽', '根蒂', '敲声', '纹理','脐部', '触感' features = ['seze', 'gendi', 'qiaosheng', 'wenli','qibu', 'chugan'] 完整代码from math import log2 import treePlotter class ID3Tree(object): def __init__(self): self.tree = {} # ID3 Tree self.dataSet = [] # 数据集 self.labels = [] # 标签集 def getDataSet(self, dataset, labels): self.dataSet = dataset self.labels = labels def train(self): # labels = copy.deepcopy(self.labels) labels = self.labels[:] self.tree = self.buildTree(self.dataSet, labels) def buildTree(self, dataSet, labels): classList = [ds[-1] for ds in dataSet] # 提取样本的类别 if classList.count(classList[0]) == len(classList): # 单一类别 return classList[0] if len(dataSet[0]) == 1: # 没有属性需要划分了 return self.classify(classList) bestFeat = self.findBestSplit(dataSet) # 选取最大增益的属性序号 bestFeatLabel = labels[bestFeat] tree = {bestFeatLabel: {}} # 构造一个新的树结点 del (labels[bestFeat]) # 从总属性列表中去除最大增益属性 featValues = [ds[bestFeat] for ds in dataSet] # 抽取最大增益属性的取值列表 uniqueFeatValues = set(featValues) # 选取最大增益属性的数值类别 for value in uniqueFeatValues: # 对于每一个属性类别 subLabels = labels[:] subDataSet = self.splitDataSet(dataSet, bestFeat, value) # 分裂结点 subTree = self.buildTree(subDataSet, subLabels) # 递归构造子树 tree[bestFeatLabel][value] = subTree return tree # 计算出现次数最多的类别标签 def classify(self, classList): items = dict([(classList.count(i), i) for i in classList]) return items[max(items.keys())] # 计算最优特征 def findBestSplit(self, dataset): numFeatures = len(dataset[0]) - 1 baseEntropy = self.calcShannonEnt(dataset) # 基础熵 num = len(dataset) # 样本总数 bestInfoGain = 0.0 bestFeat = -1 # 初始化最优特征向量轴 # 遍历数据集各列,寻找最优特征轴 for i in range(numFeatures): featValues = [ds[i] for ds in dataset] uniqueFeatValues = set(featValues) newEntropy = 0.0 # 按列和唯一值,计算信息熵 for val in uniqueFeatValues: subDataSet = self.splitDataSet(dataset, i, val) prob = len(subDataSet) / float(num) # 子集中的概率 newEntropy += prob * self.calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy # 信息增益 if infoGain > bestInfoGain: # 挑选最大值 bestInfoGain = baseEntropy - newEntropy bestFeat = i return bestFeat # 从dataset数据集的feat特征中,选取值为value的数据 def splitDataSet(self, dataset, feat, values): retDataSet = [] for featVec in dataset: if featVec[feat] == values: reducedFeatVec = featVec[:feat] reducedFeatVec.extend(featVec[feat + 1:]) retDataSet.append(reducedFeatVec) return retDataSet # 计算dataSet的信息熵 def calcShannonEnt(self, dataSet): num = len(dataSet) # 样本集总数 classList = [c[-1] for c in dataSet] # 抽取分类信息 labelCounts = {} for cs in set(classList): # 对每个分类进行计数 labelCounts[cs] = classList.count(cs) shannonEnt = 0.0 for key in labelCounts: prob = labelCounts[key] / float(num) shannonEnt -= prob * log2(prob) return shannonEnt # 预测。对输入对象进行ID3分类 def predict(self, tree, newObject): # 判断输入值是否为“dict” while type(tree).__name__ == 'dict': key = list(tree.keys())[0] tree = tree[key][newObject[key]] return tree if __name__ == '__main__': def createDataSet(): dataSet = [[1, 1, 1, 1,1, 1, 'Yes'], [2, 1, 2, 1,1, 1, 'Yes'], [2, 1, 1, 1,1, 1, 'Yes'], [1, 1, 2, 1,1, 1, 'Yes'], [3, 1, 1, 1,1, 1, 'Yes'], [1,2, 1, 1,2, 2, 'Yes'], [2, 2, 1, 2,2, 2, 'Yes'], [2, 2, 1, 1,2, 1, 'Yes'], [2, 2, 2, 2,2, 1, 'No'], [1,3, 3, 1,3, 2, 'No'], [3, 3, 3, 3,3, 1, 'No'], [3, 1, 1, 3,3, 2, 'No'], [1, 2, 1, 2,1, 1, 'No'], [3,2, 2, 2,1, 1, 'No'], [2, 2, 1, 1,2, 2, 'No'], [3, 1, 1, 3,3, 1, 'No'], [1, 1, 2, 2,2, 1, 'No'],] #'色泽', '根蒂', '敲声', '纹理','脐部', '触感' features = ['seze', 'gendi', 'qiaosheng', 'wenli','qibu', 'chugan'] return dataSet, features id3 = ID3Tree() # 创建一个ID3决策树 ds, labels = createDataSet() id3.getDataSet(ds, labels) id3.train() # 训练ID3决策树 print(id3.tree) # 输出ID3决策树 print(id3.predict(id3.tree,{'seze':2,'gendi':2,'qiaosheng':1,'wenli':1,'qibu':1,'chugan':1})) treePlotter.createPlot(id3.tree)生成决策树:ID3算法实例1.使用sklearn的决策树算法对葡萄酒数据集进行分类,要求:(1)划分训练集和测试集(测试集占20%)(2)对测试集的预测类别标签和真实标签进行对比(3)输出分类的准确率(4)调整参数比较不同算法(ID3, CART)的分类效果。2. 利用给定ID3算法,画出下列训练集的决策树。1.葡萄酒分类(1)划分训练集和测试集(测试集占20%)test_size等于几就是测试集占比x_train, x_test, y_train, y_test = train_test_split( X, Y, test_size=0.2, random_state=0)(2)对测试集的预测类别标签和真实标签进行对比预测类别标签y_predict = clf.predict(x_test)对比pd.concat([pd.DataFrame(x_test), pd.DataFrame(y_test), pd.DataFrame(y_predict)], axis=1)(3)输出分类的准确率clf.fit(x_train, y_train)score = clf.score(x_test, y_test)(4)调整参数比较不同算法(ID3, CART)的分类效果。采用ID3算法进行计算clf = tree.DecisionTreeClassifier(criterion="entropy") 采用CART算法进行计算clf = tree.DecisionTreeClassifier(criterion="gini")完整代码:# 导入相关库 from sklearn.model_selection import train_test_split from sklearn import tree from sklearn.datasets import load_wine import pandas as pd # 导入数据集 wine = load_wine() X = wine.data Y = wine.target features_name = wine.feature_names print(features_name) print(pd.concat([pd.DataFrame(X), pd.DataFrame(Y)], axis=1)) # 打印数据 # 划分数据集,数据集划分为测试集占20%; x_train, x_test, y_train, y_test = train_test_split( X, Y, test_size=0.2, random_state=0) # 采用ID3算法进行计算 clf = tree.DecisionTreeClassifier(criterion="entropy") # 采用CART算法进行计算 # clf = tree.DecisionTreeClassifier(criterion="gini") # 获取模型 clf.fit(x_train, y_train) score = clf.score(x_test, y_test) y_predict = clf.predict(x_test) print('准确率为:', score) # 对测试集的预测类别标签和真实标签进行对比 print(pd.concat([pd.DataFrame(x_test), pd.DataFrame(y_test), pd.DataFrame(y_predict)], axis=1))结果:2.只需修改数据集,标签集即可部分代码:if __name__ == '__main__': def createDataSet(): dataSet = [[1, 1, 1, 1, 'No'], [1, 1, 1, 2, 'No'], [2, 1, 1, 1, 'Yes'], [3, 2, 1, 1, 'Yes'], [3, 3, 2, 1, 'Yes'], [3, 3, 2, 2, 'No'], [2, 3, 2, 2, 'Yes'], [1, 2, 1, 1, 'No'], [1, 3, 2, 1, 'Yes'], [3, 2, 2, 1, 'Yes'], [1, 2, 2, 2, 'Yes'], [2, 2, 1, 2, 'Yes'], [2, 1, 2, 1, 'Yes'], [3, 2, 1, 2, 'No'], ] features = ['outlook', 'temp', 'humidity', 'windy'] return dataSet, features id3 = ID3Tree() # 创建一个ID3决策树 ds, labels = createDataSet() id3.getDataSet(ds, labels) id3.train() # 训练ID3决策树 print(id3.tree) # 输出ID3决策树 print(id3.predict(id3.tree, {'outlook': 2, 'temp': 2, 'humidity': 1, 'windy': 1})) treePlotter.createPlot(id3.tree)结果:
朴素贝叶斯算法输入:样本集合D={(x_1,y_1),(x_2,y_2)~(x_m,y_m); 待预测样本x; 样本标记的所有可能取值{c_1,c_2,c_3~c_k}; 样本输入变量X的每个属性变量X^i的所有可能取值{a_i1,a_i2,~,a_iAi};输出:待预测样本x所属的类别 1.计算标记为c_k的样本出现概率。2.计算标记c_k的样本,其X^i分量的属性值为a_ip的概率。3.根据上面的估计值计算x属于y_k的概率值,并选择概率最大的作为输出。1.使用sklearn的朴素贝叶斯算法对垃圾短信数据集进行分类要求:(1)划分训练集和测试集(测试集占20%) (2)对测试集的预测类别标签和真实标签进行对比 (3)掌握特征提取方法 (4)输出分类的准确率代码:from sklearn.feature_extraction.text import CountVectorizer as CV from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB as NB import pandas as pd # 加载SMS垃圾短息数据集 with open('SMSSpamCollection.txt', 'r', encoding='utf8') as f: sms = [line.split('\t') for line in f] y, x = zip(*sms) # SMS垃圾短息数据集的特征提取 y = [label == 'spam' for label in y] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0) counter = CV(token_pattern='[a-zA-Z]{2,}') x_train = counter.fit_transform(x_train) x_test = counter.transform(x_test) # 朴素贝叶斯分类器的构造与训练 model = NB() model.fit(x_train, y_train) train_score = model.score(x_train, y_train) test_score = model.score(x_test, y_test) print('train score:', train_score) print('test score:', test_score) # 对测试集的预测类别标签和真实标签进行对比 y_predict = model.predict(x_test) print('测试集的预测类别标签与真实标签的对比:\n', pd.concat([pd.DataFrame(x_test), pd.DataFrame(y_test), pd.DataFrame(y_predict)], axis=1))结果:2.自己写朴素贝叶斯算法对垃圾短信数据集进行分类代码:# coding = utf-8 import pandas as pd import numpy as np import random import math class bayesianClassifier(object): def __init__(self, ratio=0.7): self.trainset = [] self.testset = [] self.ratio = ratio def loadData(self, filepath): """ :param filepath: csv :return: list """ data_df = pd.read_csv(filepath) data_list = np.array(data_df).tolist() print("Loaded {0} samples secessfully.".format(len(data_list))) self.trainset, self.testset = self.splitData(data_list) return data_list def splitData(self, data_list): """ :param data_list:all data with list type :param ratio: train date's ratio :return: list type of trainset and testset """ train_size = int(len(data_list) * self.ratio) random.shuffle(data_list) self.trainset = data_list[:train_size] self.testset = data_list[train_size:] return self.trainset, self.testset def seprateByClass(self, dataset): """ :param dataset: train data with list type :return: seprate_dict:separated data by class; info_dict:Number of samples per class(category) """ seprate_dict = {} info_dict = {} for vector in dataset: if vector[-1] not in seprate_dict: seprate_dict[vector[-1]] = [] info_dict[vector[-1]] = 0 seprate_dict[vector[-1]].append(vector) info_dict[vector[-1]] += 1 return seprate_dict, info_dict def mean(self, number_list): number_list = [float(x) for x in number_list] # str to number return sum(number_list) / float(len(number_list)) def var(self, number_list): number_list = [float(x) for x in number_list] avg = self.mean(number_list) var = sum([math.pow((x - avg), 2) for x in number_list]) / float(len(number_list) - 1) return var def summarizeAttribute(self, dataset): """ calculate mean and var of per attribution in one class :param dataset: train data with list type :return: len(attribution)'s tuple ,that's (mean,var) with per attribution """ dataset = np.delete(dataset, -1, axis=1) # delete label summaries = [(self.mean(attr), self.var(attr)) for attr in zip(*dataset)] return summaries def summarizeByClass(self, dataset): """ calculate all class with per attribution :param dataset: train data with list type :return: num:len(class)*len(attribution) {class1:[(mean1,var1),(),...],class2:[(),(),...]...} """ dataset_separated, dataset_info = self.seprateByClass(dataset) summarize_by_class = {} for classValue, vector in dataset_separated.items(): summarize_by_class[classValue] = self.summarizeAttribute(vector) return summarize_by_class def calulateClassPriorProb(self, dataset, dataset_info): """ calculate every class's prior probability :param dataset: train data with list type :param dataset_info: Number of samples per class(category) :return: dict type with every class's prior probability """ dataset_prior_prob = {} sample_sum = len(dataset) for class_value, sample_nums in dataset_info.items(): dataset_prior_prob[class_value] = sample_nums / float(sample_sum) return dataset_prior_prob def calculateProb(self, x, mean, var): """ Continuous value using probability density function as class conditional probability :param x: one sample's one attribution :param mean: trainset's one attribution's mean :param var: trainset's one attribution's var :return: one sample's one attribution's class conditional probability """ exponent = math.exp(math.pow((x - mean), 2) / (-2 * var)) p = (1 / math.sqrt(2 * math.pi * var)) * exponent return p def calculateClassProb(self, input_data, train_Summary_by_class): """ calculate class conditional probability through multiply every attribution's class conditional probability per class :param input_data: one sample vectors :param train_Summary_by_class: every class with every attribution's (mean,var) :return: dict type , class conditional probability per class of this input data belongs to which class """ prob = {} p = 1 for class_value, summary in train_Summary_by_class.items(): prob[class_value] = 1 for i in range(len(summary)): mean, var = summary[i] x = input_data[i] p = self.calculateProb(x, mean, var) prob[class_value] *= p return prob def bayesianPredictOneSample(self, input_data): """ :param input_data: one sample without label :return: predicted class """ train_separated, train_info = self.seprateByClass(self.trainset) prior_prob = self.calulateClassPriorProb(self.trainset, train_info) train_Summary_by_class = self.summarizeByClass(self.trainset) classprob_dict = self.calculateClassProb(input_data, train_Summary_by_class) result = {} for class_value, class_prob in classprob_dict.items(): p = class_prob * prior_prob[class_value] result[class_value] = p return max(result, key=result.get) def calculateAccByBeyesian(self, ratio=0.7): """ :param dataset: list type,test data :return: acc """ self.ratio = ratio correct = 0 for vector in self.testset: input_data = vector[:-1] label = vector[-1] result = self.bayesianPredictOneSample(input_data) if result == label: correct += 1 return correct / len(self.testset) if __name__ == "__main__": bys = bayesianClassifier() data_samples = bys.loadData('IrisData.csv') print("Accuracy is:", bys.calculateAccByBeyesian(ratio=0.7))结果:
1. 使用KNN进行电影类型预测:给定训练样本集合如下: 求解:testData={"老友记": [29, 10, 2, "?片"]}。解题步骤: 1.计算一个新样本与数据集中所有数据的距离 2.按照距离大小进行递增排序 3.选取距离最小的k个样本 4.确定前k个样本所在类别出现的频率,并输出出现频率最高的类别import numpy as np def createDataset(): ''' 创建训练集,特征值分别为搞笑镜头、拥抱镜头、打斗镜头的数量 ''' learning_dataset = {"宝贝当家": [45, 2, 9, "喜剧片"], "美人鱼": [21, 17, 5, "喜剧片"], "澳门风云3": [54, 9, 11, "喜剧片"], "功夫熊猫3": [39, 0, 31, "喜剧片"], "谍影重重": [5, 2, 57, "动作片"], "叶问3": [3, 2, 65, "动作片"], "伦敦陷落": [2, 3, 55, "动作片"], "我的特工爷爷": [6, 4, 21, "动作片"], "奔爱": [7, 46, 4, "爱情片"], "夜孔雀": [9, 39, 8, "爱情片"], "代理情人": [9, 38, 2, "爱情片"], "新步步惊心": [8, 34, 17, "爱情片"]} return learning_dataset def kNN(learning_dataset,dataPoint,k): ''' kNN算法,返回k个邻居的类别和得到的测试数据的类别 ''' # s1:计算一个新样本与数据集中所有数据的距离 disList=[] for key,v in learning_dataset.items(): #对距离进行平方和开根号 d=np.linalg.norm(np.array(v[:3])-np.array(dataPoint)) #round四舍五入保留两位小数,并添加到集合中 disList.append([key,round(d,2)]) # s2:按照距离大小进行递增排序 disList.sort(key=lambda dis: dis[1]) # 常规排序方法,熟悉key的作用 # s3:选取距离最小的k个样本 disList=disList[:k] # s4:确定前k个样本所在类别出现的频率,并输出出现频率最高的类别 labels = {"喜剧片":0,"动作片":0,"爱情片":0} #从k个中进行统计哪个类别标签最多 for s in disList: #取出对应标签 label = learning_dataset[s[0]] labels[label[len(label)-1]] += 1 labels =sorted(labels.items(),key=lambda asd: asd[1],reverse=True) return labels,labels[0][0] if __name__ == '__main__': learning_dataset=createDataset() testData={"老友记": [29, 10, 2, "?片"]} dataPoint=list(testData.values())[0][0:3] k=6 labels,result=kNN(learning_dataset,dataPoint,k) print(labels,result,sep='\n')结果为喜剧片!2. 编写代码,实现对iris数据集的KNN算法分类及预测要求:(1)数据集划分为测试集占20%;(2)n_neighbors=5;(3)评价模型的准确率;(4)使用模型预测未知种类的鸢尾花。(待预测数据:X1=[[1.5 , 3 , 5.8 , 2.2], [6.2 , 2.9 , 4.3 , 1.3]])iris数据集有150组,每组4个数据。第一步:引入所需库from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import numpy as np第二步:划分测试集占20% x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)test_size为0-1的数代表占百分之几random_state为零随机数确定,每次结果都相同第三步:n_neighbors=5 KNeighborsClassifier(n_neighbors=5)第四步:评价模型的准确率KNN.fit(x_train, y_train) # 训练集准确率 train_score = KNN.score(x_train, y_train) # 测试集准确率 test_score = KNN.score(x_test, y_test)第五步:使用模型预测未知种类的鸢尾花#待预测数据:X1=[[1.5 , 3 , 5.8 , 2.2], [6.2 , 2.9 , 4.3 , 1.3]] X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]]) # 进行预测 prediction = KNN.predict(X1) # 种类名称 k = iris.get("target_names")[prediction]完整代码:from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import numpy as np if __name__ == '__main__': iris = load_iris() data = iris.get("data") target = iris.get("target") x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0) KNN = KNeighborsClassifier(n_neighbors=5) KNN.fit(x_train, y_train) train_score = KNN.score(x_train, y_train) test_score = KNN.score(x_test, y_test) print("模型的准确率:", test_score) X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]]) prediction = KNN.predict(X1) k = iris.get("target_names")[prediction] print("第一朵花的种类为:", k[0]) print("第二朵花的种类为:", k[1])结果:
1.使用最小二乘法进行房价预测:给定训练样本集合如下:求解:当房屋面积为55平方时,租赁价格是多少?给出代码与运行结果图。首先明白什么是最小二乘法,利用最小二乘法公式p = (X^TX)^-1 X^T Yimport numpy as np from numpy import mat import matplotlib.pyplot as plt if __name__ == "__main__": # 1 获得x,y数据# ########## X = np.array([10, 15, 20, 30, 50, 60, 60, 70]) y = np.array([0.8, 1, 1.8, 2, 3.2, 3, 3.3, 3.5]) plt.scatter(X, y) plt.show() # 2 矩阵形式转换X, Y Y_mat = mat(y).T # print(Y_mat) X_temp = np.ones((8, 2)) #print(X_temp) X_temp[:, 0] = X # print(X_temp) X_mat = mat(X_temp) #print(X_mat) # 3 利用解析法 p = (X^TX)^-1 X^T Y pamaters = (((X_mat.T)*X_mat).I) * X_mat.T*Y_mat ¥print(pamaters) # 4 显示 predict_Y = X_mat * pamaters # print(predict_Y) plt.figure() plt.scatter(X, y, c="blue") plt.plot(X, predict_Y, c="red") plt.title("房价预测图") # 设置图表标题 plt.xlabel("房屋面积(m^2)") # 设置x坐标轴标签 plt.ylabel("租赁价格(1000$)") # 设置y坐标轴标签 plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 plt.show() s = input("请输入房屋面积:") #print(s) s_temp = np.ones((1, 2)) s_temp[:, 0] = s #print(s_temp) s_mat = mat(s_temp) z = s_mat * pamaters print("租赁价格为:", z)散点图和折线图输入房屋面积即可得出租赁价格!2. 使用最小二乘法进行贷款额度预测:给定训练样本集合如下:求解:当工资18000、年龄30时,额度是多少?给出代码与运行结果图难点在于有两个参数画三维图需要引入mpl_toolkits.mplot3d最小二乘法公式不变 p = (X^TX)^-1 X^T Y在画图时要分别为x,y,z轴赋值,并写上坐标标签,由于数据的小数位太多,超出位数范围会报错,所以要将小数变为整数!import numpy as np from numpy import mat import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 画三维图 if __name__ == "__main__": # 1 获得x,y数据# ########## X = np.array([[4000, 25], [8000, 30], [5000, 28], [7500, 33], [12000, 40]]) Y = np.array([20000, 70000, 35000, 50000, 85000]) # 2 矩阵形式转换X, Y Y_mat = mat(Y).T X_temp = np.ones((5, 3)) X_temp[:, 0] = X[:, 0] X_temp[:, 1] = X[:, 1] #print(X_temp) X_mat = mat(X_temp) # print(X_mat) # 3 利用解析法 p = (X^TX)^-1 X^T Y pamaters = (((X_mat.T) * X_mat).I) * X_mat.T * Y_mat #print(pamaters) # 4 显示 fig1 = plt.figure() ax1 = Axes3D(fig1) x = X[:, 0] y = X[:, 1] z = Y Z = X_mat * pamaters #print(Z) n = list(map(int, Z[:, 0])) # Z中的数的位数超出范围 #print(n) ax1.scatter3D(x, y, z, c='blue') ax1.plot3D(x, y, n, c='red') plt.title("贷款额度预测图") # 设置图表标题 plt.xlabel("工资") # 设置x坐标轴标签 plt.ylabel("年龄") # 设置y坐标轴标签 ax1.set_zlabel("额度")# 设置z坐标标签 plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 plt.show() a = eval(input("请输入工资:")) b = eval(input("请输入年龄: ")) s = np.array([[a, b]]) # print(s) s_temp = np.ones((1, 3)) s_temp[:, 0] = s[:, 0] s_temp[:, 1] = s[:, 1] #print(s_temp) s_mat = mat(s_temp) m = s_mat * pamaters print("贷款额度为:", m)三维散点和折线图输入工资和年龄即可输出贷款额度!
根据示例创建ndarray,并按要求完成操作1.按要求进行切片操作import numpy as np arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr1[:2, 1:]) print(arr1[1:2, 0:2]) print(arr1[2:, 0:1]) print(arr1[:, 0:1]) # 将数组中的每个元素乘2后,按行和按列方式分别计算其最大值,打印输出结果 arr2 = arr1*2 print('按行方式分别计算其最大值:', arr2.max(1)) print('按列方式分别计算其最大值:', arr2.max(0))2.将数组中的每个元素乘2后,按行和按列方式分别计算其最大值,打印输出结果arr2 = arr1*2 print('按行方式分别计算其最大值:', arr2.max(1)) print('按列方式分别计算其最大值:', arr2.max(0)) 利用Matplotlib库,绘制出抛物线曲线图1.线为红色圆型点线图2.横坐标取值范围:[-10, 10],绘制点数503.坐标轴说明(x轴:x tick,y軕:voltage)4.图标题为抛物线示意图。import matplotlib.pyplot as plt import numpy as np x = np. linspace(-10, 10, 50) # x坐标采样点生成,[-10,10]区间,50个点 y = [] for i in x: a = i**2 y.append(a) plt.plot(x, y, 'ro--') # 控制图形格式为红色圆形的虚线 plt.title("抛物线示意图") # 设置图表标题 plt.xlabel("x tick") # 设置x坐标轴标签 plt.ylabel("voltage") # 设置y坐标轴标签 plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 plt.savefig("test", dpi=300) # 保存图表 plt.show()panda读取csv文件1并统计每个积分区间(每5分)人数分布,绘制图形1.读取 CSV文件生成DataFramedf = pd.read_csv('D:/luohu3.csv') print(df)2. 数据预处理data = df.dropna(0) # 删除所有包含空值的行或列 print(data.info())3. 对数据进行离散化处理通过describe()查看最大值最小值,来确定区间x = data["积分分值"] print(data.describe()) # 查看最大值与最小值 bins = np.arange(90, 126, 5) score_bins = pd.cut(x, bins) # 对数据进行离散化处理 print(score_bins)4. 按积分分割区间进行分组统计df1 = data.groupby(score_bins)["积分分值"].count() print(df1)5. 绘制图形rot=0使横坐标的数据横过来df1.plot(kind="bar", rot=0) plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 显示负号 plt.show()完整代码:import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取 CSV文件生成DataFrame df = pd.read_csv('D:/luohu3.csv') print(df) print(df.info()) # 获取 DataFrame 的摘要 print(df.head()) # 根据位置返回对象的前n行信息(默认值为5) ,用于快速测试数据集 print(df.describe()) # 生成描述性统计数据,总结数据集分布的集中趋势,分散和形状,不包括 NaN值。 # 数据预处理 data = df.dropna(0) # 删除所有包含空值的行或列 print(data.info()) # data = df.drop_duplicates() # print(data.info()) x = data["积分分值"] print(data.describe()) # 查看最大值与最小值 bins = np.arange(90, 126, 5) score_bins = pd.cut(x, bins) # 对数据进行离散化处理 print(score_bins) # 按积分分割区间进行分组统计 df1 = data.groupby(score_bins)["积分分值"].count() print(df1) # 绘制图形 df1.plot(kind="bar", rot=0) plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False plt.show()2.按照"单位名称"分组统计每个单位的人数信息,将人数排名前10的单位和人数用柱状图表示出来。前面几步和上一个基本相同,就不多说了。特殊的就三步:1.按单位名称进行分组统计df1 = data.groupby(data['单位名称'])["单位名称"].count()2.分组结果排序df2 = df1.sort_values(ascending=False)3.取排序结果的前10个数据,切片df3 = df2[0:10]完整代码:import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取 CSV文件生成DataFrame df = pd.read_csv('D:/luohu3.csv') # print(df) print(df.info()) # 获取 DataFrame 的摘要 # print(df.head()) # 根据位置返回对象的前n行信息(默认值为5) ,用于快速测试数据集 # print(df.describe()) # 生成描述性统计数据,总结数据集分布的集中趋势,分散和形状,不包括 NaN值。 # 数据预处理 data = df.dropna(0) # 删除所有包含空值的行或列 print(data.info()) # data = df.drop_duplicates() # print(data.info()) df1 = data.groupby(data['单位名称'])["单位名称"].count() # 按单位名称进行分组统计 print(df1) df2 = df1.sort_values(ascending=False) # 分组结果排序 print(df2) df3 = df2[0:10] # 取排序结果的前10个数据 # 绘制图表 df3.plot(kind="bar", rot=0) plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False plt.show()统计年龄分布情况(5岁的间隔统计),绘制出年龄分布图。这个和第一个非常相似,难点在于需要将出生年月转化为年龄。data = data.copy() data['年龄'] = [dt.datetime.today().year - i.year for i in pd.to_datetime(data["出生年月"])] 如果不添加data.copy()会报错SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value instead完整代码:import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime as dt # 读取 CSV文件生成DataFrame df = pd.read_csv('D:/luohu3.csv') print(df) print(df.info()) # 获取 DataFrame 的摘要 print(df.head()) # 根据位置返回对象的前n行信息(默认值为5) ,用于快速测试数据集 print(df.describe()) # 生成描述性统计数据,总结数据集分布的集中趋势,分散和形状,不包括 NaN值。 # 数据预处理 data = df.dropna(0) # 删除所有包含空值的行或列 print(data.info()) # data = df.drop_duplicates() # print(data.info()) # 获取年龄数据 data = data.copy() data['年龄'] = [dt.datetime.today().year - i.year for i in pd.to_datetime(data["出生年月"])] # 日期数据如何处理 x = data["年龄"] # 设置统计分值段范围 print(data.describe()) # 查看最大值与最小值 bins = np.arange(35, 65, 5) time_bins = pd.cut(x, bins) # 对数据进行离散化处理 print(time_bins) # 按积分分割区间进行分组统计 df1 = data.groupby(time_bins)["年龄"].count() print(df1) # 绘制图形 df1.plot(kind="bar", rot=0) plt.rcParams['font.sans-serif'] = ['Kaiti'] # 用来正常显示中文(黑体)常用字体包括: Kaiti-楷体; FangSong-仿宋; Microsoft YaHei-微软雅黑 plt.rcParams['axes.unicode_minus'] = False plt.show()
1、将上述学生信息存入数据库中,表名为tb_score,读取该文件,用合适的数据类型存储文件内容,并打印输出所有内容。1.首先创建数据库!2.创建表连接 StdDB数据库config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '1414141', 'db' : 'StDB' } conn = pymysql.connect(**config) 执行 SQL 创建 表tb_scorecursor = conn.cursor() sql = "CREATE TABLE tb_score(ID INT NOT NULL, name VARCHAR(20) NULL,score INT NULL, PRIMARY KEY (ID))" cursor.execute(sql) conn.close()将数据用多维列表方式存储在内存中ls = [] ls.append([10001, "小明", 90]) ls.append([10002, "小白", 85]) ls.append([10003, "小兰", 83]) ls.append([10004, "小张", 92]) ls.append([10005, "小赵", 81])多条数据插入数据库中cursor = conn.cursor() sql = "insert into tb_score(ID,name,score) values({0},'{1}',{2})" try: for line in ls: cursor.execute(sql.format(*line)) conn.commit() except: conn.rollback() finally: conn.close()读取数据库中数据cursor = conn.cursor() sql = "select * from tb_score" cursor.execute(sql) rows = cursor.fetchall() ls2 = list(map(list, rows)) conn.close() print(ls2)(1)插入一条学生记录信息:学号:10006,姓名:小花,成绩:92插入一条数据ls3 = [10006, "小花", 92] cursor = conn.cursor() sql = "insert into tb_score(ID,name,score) values({0},'{1}',{2})" try: cursor.execute(sql.format(*ls3)) conn.commit() except: conn.rollback() finally: conn.close()(2)打印输出学生成绩在90分以下的所有学生信息根据条件读取数据库的信息cursor = conn.cursor() sql = "select ID,name,score from tb_score where score<{0}" cursor.execute(sql.format(90)) rows = cursor.fetchall() rows = list(map(list, rows)) print(rows)(3)删除小明的成绩删除数据库中的数据cursor = conn.cursor() sql = " delete from tb_score where name=%s " try: cursor.execute(sql, ["小明"]) conn.commit() except: conn.rollback()实验题目:csv文件导入数据库将StudentInfo.csv文件中的信息导入数据库StudentTestimport pymysql # 连接 StudentTest数据库 config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '1414141', 'db' : 'StudentTest', 'local_infile': 1 } conn = pymysql.connect(**config) # 执行 SQL 创建 表tb_student cursor = conn.cursor() sql = "CREATE TABLE tb_student(ID INT NOT NULL, name VARCHAR(20) NULL,score INT NULL,final INT NULL, PRIMARY KEY (ID))" cursor.execute(sql) conn.close() # CSV数据高效导入 MYSQL cursor = conn.cursor() sql = " LOAD DATA LOCAL INFILE '{0}' INTO TABLE {1} CHARACTER SET GBK FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES " try: cursor.execute(sql.format("D:/studentInfo.csv", "tb_student")) conn.commit() except Exception as e: print(e) conn.rollback() cursor = conn.cursor() sql = "select * from tb_student" cursor.execute(sql) rows = cursor.fetchall() ls2 = list(map(list, rows)) conn.close() print(ls2) 数据库导出到csv文件数据库StudentTest中的信息导出到csvdata.csv文件中import pymysql # 连接 StudentTest数据库 config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '1414141', 'db' : 'StudentTest', 'local_infile': 1 } conn = pymysql.connect(**config) cursor = conn.cursor() sql = " select * into outfile '{0}' CHARACTER SET GBK FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' from(select '学号','姓名 ','平均成绩','期末成绩' union select * from tb_student) as b " try: cursor.execute(sql.format("D:/csvdata.csv",)) conn.commit() except Exception as e: print(e) conn.rollback() conn.close() 导出成功,查看CSV文件出现‘The used command is not allowed with this MySQL version’错误今天做实验时将csv数据导入数据库时出现‘The used command is not allowed with this MySQL version’错误,网上说是从本地导入文件的参数没有打开,在mysql.data升级之后,为了安全考虑,默认不允许加载本地文件数据。查找了好几个方法嫌麻烦,突然想起了老师原来讲过! 只需在连接数据库时添加local_infile:1就可以解决。例如:import pymysql # 连接 StudentTest数据库 config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '12346', 'db' : 'StudentTest' } conn = pymysql.connect(**config) CSV数据导入会出错!import pymysql # 连接 StudentTest数据库 config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '12346', 'db' : 'StudentTest', 'local_infile': 1 } conn = pymysql.connect(**config) 这样就不会出错了!
MySql数据库操作首先在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装Python数据库操作环境配置离线安装:pip install 下载的安装包名在线安装:输入以下命令pip install pymysql出现这样说明安装成功!数据库操作的基本流程创建 Connection数据库操作对象使用Pymysql模块的connect() 方法可生成一个 connection 对象。connect()参数如下:• host: 数据库主机名.默认是用本地主机• user: 数据库登陆名.默认是当前用户• passwd: 数据库登陆的密码.默认为空• db: 要使用的数据库名.没有默认值• port: MySQL服务使用的TCP端口.默认是3306• charset: 数据库编码• local_infile: 是否允许读取本地文件创建数据库create database 数据库名连接数据库import pymysql config = {'host': 'localhost', 'port': 3306, 'user': 'root', 'passwd': '密码', 'db' : '数据库名' } conn = pymysql.connect( ** config)创建表SQL语句:CREATE TABLE 表名(ID INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NULL, age INT NULL, score INT NULL, PRIMARY KEY (ID));使用connection 对象,常用方法: cursor():创建游标对象。一个游标允许用户执行数据库命令和得到查询结果 excute(sql[, args]):执行一个数据库查询或命令 callproc(func[,args]):调用一个存储过程 fetchone():得到一行记录 fetchall():得到所有行记录close():关闭对象,关闭后无法再进行操作,除非再次创建连接。cursor = conn.cursor() sql = "CREATE TABLE tb_Student(ID INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NULL, age INT NULL, score INT NULL, PRIMARY KEY (ID))" cursor.execute(sql) conn.close()将二维列表数据插入数据库姓名 年龄 成绩 杨洋 18 90 张艺兴 19 92 彭昱畅 17 89(1)将数据用多维列表方式存储在内存中ls = [] ls.append(["杨洋",18,90]) ls.append(["张艺兴",19,92]) ls.append(["彭昱畅",17,89])(2)写入数据库、读取数据内容cursor = conn.cursor() sql = "insert into tb_student(name,age,score) values('{0}',{1},{2})" try: for line in ls: cursor.execute(sql.format(*line)) conn.commit() except: conn.rollback() finally: conn.close()读取数据库中数据cursor = conn.cursor() sql = "select * from tb_student" cursor.execute(sql) rows = cursor.fetchall() ls =list(map(list,rows)) conn.close() print(ls)根据条件读取数据库的信息cursor = conn.cursor() sql = "select name,age,score from tb_student where score<{0}" cursor.execute(sql.format(90)) rows = cursor.fetchall() rows = list(map(list,rows)) print(rows)修改数据库的信息cursor = conn.cursor() sql = "update tb_student set score = 80 where name=%s" try: cursor.execute(sql,["杨洋"]) conn.commit() except: conn.rollback()删除数据库的信息cursor = conn.cursor() sql = " delete from tb_student where score<%s " try: cursor.execute(sql,[85]) conn.commit() except: conn.rollback()SQL 防注入问题所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗 服务器执行恶意的SQL命令。例子user=“root”password=“123456”如果知道用户名和密码用以下语句登录验证:user,pwd = "root","123456" cursor = conn.cursor() sql = "select * from tb_login where user = '{0}' and pwd ='{1}' " cursor.execute(sql.format(user,pwd)) row = cursor.fetchone() print(row)肯定是登录验证成功!但是如果我不知道用户名和密码呢?我也可以用下面通过验证:user = "suiyishu' or 1=1 --'" pwd = "2846946" cursor = conn.cursor() sql = "select * from tb_login where user = '{0}' and pwd ='{1}' " cursor.execute(sql.format(user,pwd)) row = cursor.fetchone() print(row)竟然也通过验证了!不可思议!那到底为什么呢?‘or 1=1’无论前面输入什么最终用户名验证都是True'--'跳过密码验证防Sql注入的方法:1.带参数的Sql语句 : pymysql模块使用%s来实现SQL语句参数化是解决SQL注入的最佳解决方案,在程序向数据库发送SQL执行时,将SQL语句和参数分开传递,动态参数在SQL语句中使用占位符,在数据库端在填入参数执行,即可规避SQL注入的问题,并提高了数据库执行效率。• Python支持SQL参数化,动态参数用%s表示,cursor.execute()的第2个参数位置进行SQL参数的传递,参数类型是tuple, list 或 dict。user,pwd = "root","123456" cursor = conn.cursor() sql = "select * from tb_login where user = %s and pwd =%s " cursor.execute(sql,(user,pwd)) row = cursor.fetchone() print(row)2.使用存储过程存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。• 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。• 存储过程就是数据库 SQL 语言层面的代码封装与重用。在stdDB数据库中创建一个存储过程p_login,如下:CREATE PROCEDURE FindAllStu ( In p_stdID varchar(20))BEGINSelect * from StudentInfo where stdID = p_stdID ;ENDPyMysql模块调用存储过程:cursor.callproc(func[,args]):调用一个存储过程
实验题目:文件读取将StudentInfo中的信息以字典的形式存储在列表里。文件内容:学号|姓名|平时成绩|期末成绩1445204009|王召|100|901445204010|林锦|95|671445204011|张晓|80|901445204012|赵雨|90|79第一步:打开文件with open("studentInfo.txt", 'r', encoding='utf8') as f:1.encoding='utf8'防止读取的为乱码2.使用with的话就不用close()了第二步:读取第一行,以‘|’分割并去掉‘\n’,转化为列表作为字典的keyhead = f.readline().strip().split('|')1.strip()去除'\n'2.split('|')以‘|’分割第三步:读取一行,以‘|’分割并去掉‘\n’,转化为列表 for line in f: line = line.strip().split('|') # 读取一行,以‘|’分割并去第四步:为字典的key赋值对应的value for i in range(len(head)): f_dict = {} f_dict[head[i]] = line[i]第五步:将字典添加进列表 f_list = [] f_list.append(f_dict)第六步:输出print(f_list)代码整合:with open("studentInfo.txt", 'r', encoding='utf8') as f: head = f.readline().strip().split('|') # 读取第一行,以‘|’分割并去掉‘\n’,转化为列表作为字典的key f_list = [] for line in f: line = line.strip().split('|') # 读取一行,以‘|’分割并去掉‘\n’,转化为列表 f_dict = {} for i in range(len(head)): f_dict[head[i]] = line[i] # 为字典的key赋值对应的value f_list.append(f_dict) # 将字典添加进列表 print(f_list) 结果:实验题目:字典格式读取文件现有一个user.csv文件,内容如下:name,username,email 杨洋,yangy,yangy@sina.com 贾子豪,jiazh,jiazh@126.com于飞,yuf,yuf@163.com 田宇辰,tianych,tianych@sina.com1)以字典格式读取csv文件并打印出每个人的名字和电子邮件地址2)新建usercopy.csv文件,将user.csv文件的内容按照csv文件写入的方式写入进usercopy.csv中。import csv with open('user.csv', 'r', encoding='utf8') as f: # 读 dictReader = csv.DictReader(f) header = dictReader.fieldnames ls = [] for row in dictReader: ls.append(list(row.values())) print(ls) with open('usercopy.csv', 'w', encoding='utf8') as file: # 写 write = csv.writer(file) write.writerows(ls) 自定义一个异常类:下面定义了一个CandleShop类:class CandleShop: name = "Here's a Hot Tip: Buy Drip Candles" def __init__(self, stock): self.stock = stock def buy(self, color): self.stock[color] = self.stock[color] - 1 candle_shop = CandleShop({'blue': 6, 'red': 2, 'green': 0}) candle_shop.buy('blue')1)自定义一个异常类OutOfStack2)请修改实例buy当购买蜡烛的量超出库存时会抛出OutOfStack异常3)想办法在主程序中加一个代码会引起程序抛出OutOfStack4)捕获该异常,并输出异常的具体信息。class CandleShop: name = "Here's a Hot Tip: Buy Drip Candles" def __init__(self, stock): self.stock = stock def buy(self, color): self.stock[color] = self.stock[color] - 1 class OutOfStack(Exception): # (1)自定义一个异常类OutOfStack pass def new_buy(self, color): # (2)动态修改实例buy当购买蜡烛的量超出库存时会抛出OutOfStack异常 if self.stock[color] > 0: self.stock[color] = self.stock[color] - 1 else: raise OutOfStack("购买蜡烛的量超出库存!") # 产生异常 try: candle_shop = CandleShop({'blue': 6, 'red': 2, 'green': 0}) CandleShop.buy = new_buy candle_shop.buy('blue') candle_shop.buy('green') # (3)加一个代码会引起程序抛出OutOfStack except OutOfStack as e: # (4)捕获该异常 print(e) # 输出异常的具体信息 else: print("蜡烛还有库存!")
组合数据类型字符串、列表、元组、集合和字典都属于组合数据类型。根据数据的组织方式不同,组合数据类型主要分为三类:序列、集合和映射。序列类型序列类型指元素按照一定的顺序排成一列的一组数。可存放多个值的连续内存空间,值具有一定的先后顺序。元素类型可以不同,通过索引访问序列的特定元素。• 序列类型支持双向索引:正向索引和反向索引。• 正向索引时,索引开始:0,索引结束:序列长度-1。• 反向索引时,索引开始:-1,索引结束:序列的长度的负数。• 序列类型包括:• 字符串(string)• 列表(list)• 元组(tuple)这里主要讲一下列表!好友管理系统1、实验题目:好友管理系统 请设计一个好友管理系统,每个功能都对应一个序号,用户可根据提示“请输入您的选项”选择序号执行相应的操作,包括:(1)添加好友:用户根据提示“请输入要添加的好友:”输入要添加好友的姓名,添加后会提示“好友添加成功”。(2)删除好友:用户根据提示“请输入删除好友姓名:”输入要删除好友的姓名,删除后提示“删除成功”。 (3)备注好友:用户根据提示“请输入要修改的好友姓名:”和“请输入修改后的好友姓名:”分别输入修改前和修改后的好友姓名,修改后会提示“备注成功”。 (4)展示好友:若用户还没有添加过好友,提示“好友列表为空”,否则返回每个好友的姓名。(5)退出:关闭好友系统。list_f = [] print("好友管理系统") print("1.添加好友") print("2.删除好友") print("3.备注好友") print("4.展示好友") print("5.退出") while True: n = int(input("请输入您的选项:")) if n == 1: f = input("请输入要添加的好友:") list_f.append(f) print("好友添加成功") elif n == 2: f = input("请输入删除好友姓名:") list_f.remove(f) print("删除成功") elif n == 3: o_name = input("请输入要修改的好友姓名:") n_name = input("请输入修改后的好友姓名:") i = list_f.index(o_name) list_f[i] = n_name print("备注成功") elif n == 4: if len(list_f) == 0: print("好友列表为空") else: for m in list_f: print(m) elif n == 5: break print("关闭好友系统")重点:1.建一个空列表存放好友信息。2.append()添加3.remove()删除4.index()索引匹配第一次出现的位置2、实验题目:中文数字对照表输入一个数字,转换成中文数字。比如:1234567890 -> 壹贰叁肆伍陆柒捌玖零。简单直接上代码。numbers = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] number = input("输入一个数字:") for i in number: print(numbers[int(i)], end="") 3、实验题目:学生成绩管理将学生对象存入列表中,并按成绩对学生进行排序,并获取成绩最高和成绩最低的学生信息,并将最高分和最低分的学生从列表删除,最后再对列表进行拷贝,对拷贝的列表进行翻转输出。import copy class Student: def __init__(self, sno, name, age, score): self.sno = sno self.name = name self.age = age self.score = score def __str__(self): return '学号:'+self.sno+',姓名:'+self.name+',年龄:'+self.age+',成绩:'+self.score if __name__ == '__main__': ls1 = [Student('181010', '黎明', '18', '90'), Student('181256', '王三千', '20', '89'), Student('182345', '国谷机', '18', '98'), Student('181568', '白开水', '19', '67')] ls1.sort(key=lambda stu: stu.score) # n = min(ls1, key=lambda stu: stu.score) # m = max(ls1, key=lambda stu: stu.score) # print("成绩最高的学生信息:", m) # print("成绩最低的学生信息:", n) print("成绩最高的学生信息:", ls1[3]) print("成绩最低的学生信息:", ls1[0]) del ls1[3], ls1[0] ls2 = copy.deepcopy(ls1) ls2.reverse() for i in range(2): print(ls2[i]) 重点:1.面向对象_str _print输出时自动调用sort排序del 删除copy.deepcopy()深拷贝reverse()翻转4、实验题目:商品筛选有如下商品价格:568,239,368,425,121,219,834,1263,26,请输入随意一个价格区间进行商品的筛选,并能够对筛选出的商品进行从大到小和从小到大进行排序,并求出这个区间的商品的平均价格。简单直接上代码!list1 = [568, 239, 368, 425, 121, 219, 834, 1263, 26] list2 = [] sum = 0 a = int(input('请输入一个价格下区间:')) b = int(input('请输入一个价格上区间:')) for i in list1: if i>a and i<b: list2.append(i) list2.sort() print('从小到大:', list2) list2.sort(reverse=True) print('从大到小', list2) for m in list2: sum += m avge = sum/len(list2) print('平均价格:%.2f' % avge) 运行成功!5、实验题目:生成验证码验证码一般是包括一些随机产生的数字或符号,请实现随机生成一组6位验证码的功能。每个字符可以是大写字母、小写字母或数字,有且只能是这三种类型中的一种。1.使用range()实现思想:1.需要引入random库2.将生成验证码功能写成函数,可以生成任意位数的验证码3.通过ASCLL的值转换为大小写字母4.随机抽取import random # 用range() def code(len): code_list = [] for i in range(10): code_list.append(str(i)) #生成数字 for i in range(65, 91): code_list.append(chr(i)) #生成大写字母 for i in range(97, 123): code_list.append(chr(i)) #生成小写字母 r = random.sample(code_list, len) m = ''.join(r) return m if __name__ == '__main__': n = code(6) print(n) 2.使用randint()1.需要引入random库2.random.randint()随机抽取3.chr()通过ASCLL值转换为字符import random # 用randint() code = '' for i in range(6): n = random.randint(0, 9) b = chr(random.randint(65, 90)) s = chr(random.randint(97, 122)) code += str(random.choice([n, b, s])) print(code) 第二种更快,更简单!6.实验题目:编写程序,使用列表生成表达式生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。(提示,使用切片)import random ls = [random.randint(1, 100) for i in range(20)] print('生成列表:', ls) ls[::2] = sorted(ls[::2], reverse=True) print('排序后:', ls) 7.实验题目:编写程序,使用列表生成表达式生成一个包含50个随机整数的列表,然后删除其中所有奇数(提示:从后向前删。)import random ls = [random.randint(1, 1000) for i in range(50)] print('生成列表:', ls) for i in ls[::-1]: if i % 2 != 0: ls.remove(i) print('删除后:', ls) # ls1 = [i for i in ls if i % 2 == 0] # print('删除后:', ls1) ls1 = [i for i in ls if i % 2 == 0]print('删除后:', ls1)也能实现同等功能!
面向对象编程首先了解一下面向对象编程面向对象编程(Object Oriented Programming,OOP),是一种程序设计思想,解决软件复用的设计和编程方法。• 本质是以建立模型体现出来的抽象思维过程。模型用于反映现实世界中事物特征。• 任何一种事物都可以作为对象,“万物皆对象” ,对象包含了数据和操作数据的函数。• 例如,在实际应用中,可以将一个人抽象为一个类,该类中包含一个人的“姓名,年龄,性别”等信息。• Python是一种典型的面向对象的语言,Python中的数据都是对象。基本概念•类: 用来描述具有相同的属性和方法的对象的集合。定义了该集合中每个对象所共有的属性和方法。对象是类的实例。• 对象:通过类定义的数据结构实例。• 实例化:创建一个类的实例,类的具体对象。• 类的成员:包括属性,方法等。• 继承:即一个类(derived class)继承基类(base class)的属性和方法。• 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。Python 用面向对象的编写实现大象进冰箱的整个过程首先应明白分几步:1.把冰箱门打开2.把大象放进去3.把冰箱门关上多写了一个动物类和电器类,这样就可以把任何动物放入任何电器内了!class animals(): def __init__(self, name): self.name = name class elephant(animals): def go(self): print("把%s放进去" % self.name) class electrics(): def __init__(self, name): self.name = name class refrigerator(electrics): def open(self): print("打开%s门!" % self.name) def close(self): print("关闭%s门" % self.name) if __name__ == '__main__': e = elephant("大象") r = refrigerator("冰箱") r.open() e.go() r.close() Python 编写一个学生类,要求有一个计数器,每次实例化后计数实例化了多少个学生class school(): def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age class student(school): num = 0 def instant(self): student.num += 1 print("%s实例化,共实例化%d个学生" % (self.name, student.num)) if __name__ == '__main__': stu1 = student("黑刃", "男", "39") stu2 = student("九幽", "女", "19") stu3 = student("无极", "男", "20") stu4 = student("天机", "女", "45") stu5 = student("亡灵", "女", "66") stu6 = student("妖匠", "男", "45") stu1.instant() stu2.instant() stu3.instant() stu4.instant() stu5.instant() stu6.instant()
Python 编写一个函数 cacluate编写一个函数 cacluate ,可以接收任意多个数,返回的是一个元组元组的第一个值为所有参数的平均值第二个值是大于平均值的所有数.def cacluate(*args): list1 = [] sum = 0 for i in args: sum += i avg = sum / len(args) for i in args: if i > avg: list1.append(i) return avg, list1 if __name__ == '__main__': n = cacluate(1, 2, 3, 4, 5, 6, 7, 8, 9) print(n) def cacluate(*args): 中args为元组list1 = [] 用来存储大于平均值的所有数avg = sum / len(args) 求平均值list1.append(i) 将数添加进列表内return 返回多个值时,会自动转为一个元组。Python编写一个函数,接收字符串参数返回一个元组编写一个函数,接收字符串参数返回一个元组, ehlla WROLD 元组的第一个值为大写字母的个数,第力个值为小与字母个数。def num(str1): big = 0 small = 0 for i in str1: if i.isupper(): big += 1 elif i.islower(): small += 1 return big, small if __name__ == '__main__': s = 'ehlla WROLD' n = num(s) print(n) if i.isupper(): big += 1 大写加一elif i.islower(): small += 1 小写加一使用高阶函数方式设计Calc函数,实现加、减、乘、除、乘方等计算功能def add(x, y): return x+y def des(x, y): return x-y def cal(x, y): return x*y def dec(x, y): return x/y def pow(x, y): return x**y def Calc(f, x, y): return f(x, y) if __name__ == '__main__': a = int(input('输入数字:')) while True: c = input('输入运算符:') b = int(input('输入数字:')) if c == '+': a = Calc(add, a, b) print('加法:', a) elif c == '-': a = Calc(des, a, b) print('减法:', a) elif c == '*': a = Calc(cal, a, b) print('乘法:', a) elif c == '/': a = Calc(dec, a, b) print('除法:', a) elif c == '**': a = Calc(pow, a, b) print('乘方:', a) else: break 实现了连续计算。使用闭包编写一个学生成绩平均统计。要求每次调用函数传入一个学生成绩,得到已经传入成绩的平均分。def outer(): def inner(*args): sum = 0 for i in args: sum += i avg = sum/len(args) return avg return inner if __name__ == '__main__': ls = [] while True: grade = int(input('输入学生成绩,输入0退出:')) if grade == 0: break else: ls.append(grade) f = outer() avgs = f(*ls) print('平均分:', avgs)编写一个装饰器,使其能够打印输出所装饰函数的运算时间import time def deco1(func): def inner1(*args, **kwargs): stat = time.time() func(*args, **kwargs) end = time.time() print('耗时:', end - stat) return inner1 @deco1 def f1(a, b): while b < 100000: a += b b += 1 print(a) if __name__ == '__main__': f1(0, 1) 总结通过本次几个案例了解了函数的定义与调用,高阶函数,闭包以及装饰器!
python 提取出所有学生的序号,姓名,成绩# 提取出所有学生的序号,姓名,成绩 str1='''<tbody> <tr><td><span><span class="c-index c-index-hot1 c-gap-icon-right-small">1</span>张婷婷</span></td><td class="opr-toplist-right">92<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> <tr><td><span><span class="c-index c-index-hot1 c-gap-icon-right-small">2</span>王华</span></td><td class="opr-toplist-right">91<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> <tr><td><span><span class="c-index c-index-hot1 c-gap-icon-right-small">3</span>张岚</span></td><td class="opr-toplist-right">90<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> <tr><td><span><span class="c-index c-gap-icon-right-small">4</span>孙鸿峰</span></td><td class="opr-toplist-right">90<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> <tr><td><span><span class="c-index c-gap-icon-right-small">5</span>周海栋</span></td><td class="opr-toplist-right">89<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> <tr><td><span><span class="c-index c-gap-icon-right-small">6</span>武静</span></td><td class="opr-toplist-right">88<i class="opr-toplist-st c-icon c-icon-down"></i></td></tr> </tbody>''' list1 = str1.split('</tr>', 5) for i in list1: no_begin = i.find('c-gap-icon-right-small">') + len('c-gap-icon-right-small">') no_end = i.find('</span>') no = i[no_begin:no_end] print(no, end=' ') name_begin = no_end + len('</span>') name_end = i.rfind('</span>') name = i[name_begin:name_end] print(name, end=' ') score_begin = i.index('class="opr-toplist-right">')+len('class="opr-toplist-right">') score_end = i.index('<i class="opr-toplist-st c-icon c-icon-down">') score = i[score_begin:score_end] print(score, end=' ') print('') python 敏感词过滤疫苗,疫情我们国家新冠病毒疫苗接种的基本原则是“知情、同意、自愿”。接种人群的数量和群众接种意愿是直接相关的,所以在接种工作过程中我们一直在关注这个问题,也是接种工作的重点。我们一直在跟踪研究这个问题,根据现在了解的情况看,接种意愿受到的影响因素比较多,接种意愿变化也比较大。当前看,影响接种意愿的有两个主要因素:第一是疫情防控因素,我们国家目前采取了有力得当的疫情防控措施,所以我国的疫情总体平稳,部分群众就认为感染风险比较低,暂时不需要接种疫苗来增加保护力;第二是由于新冠病毒疫苗属于新上市疫苗,部分群众希望能够看到更多关于疫苗使用效果的信息,大家非常关注安全性、有效性等方面的数据,大家考虑对疫苗有更多了解之后再接种。当前主要是这两个方面因素有较大影响作用。过滤敏感词:疫苗,疫情# 敏感词过滤 str = "我们国家新冠病毒疫苗接种的基本原则是“知情、同意、自愿”。接种人群的数量和群众接种意愿是直接相关的,所以在接种工作过程中我们一直在关注这个问题,也是接种工作的重点。我们一直在跟踪研究这个问题,根据现在了解的情况看,接种意愿受到的影响因素比较多,接种意愿变化也比较大。当前看,影响接种意愿的有两个主要因素:第一是疫情防控因素,我们国家目前采取了有力得当的疫情防控措施,所以我国的疫情总体平稳,部分群众就认为感染风险比较低,暂时不需要接种疫苗来增加保护力;第二是由于新冠病毒疫苗属于新上市疫苗,部分群众希望能够看到更多关于疫苗使用效果的信息,大家非常关注安全性、有效性等方面的数据,大家考虑对疫苗有更多了解之后再接种。当前主要是这两个方面因素有较大影响作用。" str1 = str.replace('疫苗', '**') str2 = str1.replace('疫情', '**') print(str2) 张三的学号是1101,张三的成绩为84.535分1.通过位置参数2.通过关键字参数3.映射-列表4.映射-字典5.保留2位小数# 要求输出:张三的学号是1101,张三的成绩为84.535分 str = '{}的学号是{},{}的成绩为{}分' # 1.通过位置参数 str1 = '{0}的学号是{1},{0}的成绩为{2}分' print(str1.format('张三', '1101', 84.535)) # 2.通过关键字参数 str2 = '{name}的学号是{no},{name}的成绩为{score}分' print(str2.format(name='张三', no='1101', score=84.535)) # 3.映射-列表 str3 = '{0}的学号是{1},{0}的成绩为{2}分' list1 = ['张三', '1101', 84.535] print(str3.format(*list1)) # 4.映射-字典 str4 = '{name}的学号是{no},{name}的成绩为{score}分' item1 = {'name': '张三', 'no': '1101', 'score': 84.535} print(str4.format(**item1)) # 5.保留2位小数 str5 = '{0}的学号是{1},{0}的成绩为{2:.2f}分' print(str5.format('张三', '1101', 84.535)) 总结通过前两个实验,学会了字符串的切割和拼接替换为以后的爬虫打下基础!
Python模拟个人用户登录业务需求:要求:账号:admin 密码:1231.登录时给3次机会。如果成功,显示欢迎xxx。如果登录失败,显示录入错误你还有x次机会。如果3次机会使用完毕,则显示登录超限,请明天再登录。关键技术分析:• 1. 登录需要用户名和密码,也就是两个字符串。• 2. 用户名和密码应该使用键盘输入,获取两个字符串。• 3. 怎么样才算登录成功?需要注册的时候所使用的用户名和密码。• 4. 验证输入的用户名和密码和注册时是否一致。• 5. 3次机会,使用for• 6. 如果登录成功需要跳出循环。显示欢迎xxx。如果失败,需要if判断是否机会使用完毕for i in range(3): name = input('请输入用户名:') pwd = input('请输入密码:') if name == 'admin' and pwd == '123': print('欢迎:'+name) break elif i < 2: n = int(2-i) print('输入错误,你还有%d次机会' % n) continue else: print('登录超限,请明天再登录') breakPython银行金额大写汉字转换业务需求:银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字。• 目前只需完成1~5位整数转换即可。示例:*输入金额:> 32542汉字转换:> 叁 萬 贰 仟 伍 佰 肆 拾 贰 圆 整*关键技术分析:• 使用For循环完成数字每一位的拆解。• 利用列表下标实现对位转换。编程思路:程序可以拆分为3个环节实现:需要创建两个列表,为后续对位转换做准备:环节1:计算出用户输入金额的位数;环节2:利用已知位数完成每一位的拆解;环节3:通过列表下标对位实现最终输出。• 开发技巧:需要创建两个列表,为后续对位转换做准备:• 汉字列表:['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾']• 单位列表:['圆','拾', '佰', '仟', '萬']list_chinese = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾'] list_unit = ['圆', '拾', '佰', '仟', '萬'] money = input('input 金额 五位以下: ') price = int(money[:5]) # 去除首位的0 list_price = list(str(price)) end_zero = 1 # 末尾是否为0 now = 1 # 当前是否为0 len_price = len(list_price) for i in range(len_price): list_price[i] = list_chinese[int(list_price[i])] # 对位转换成大写 zero = list_chinese[0] # 零 if list_price[-1] == zero: end_zero = 0 for i in range(len_price): if len_price == 1 and end_zero == 0: print(list_price[0], end='') print(list_unit[0], end='') # 0时 break elif i == len_price - 1 and end_zero == 0: print(list_unit[0], end='') break elif i == len_price - 1 and end_zero == 1: print(list_price[i], end='') print(list_unit[len_price - i - 1], end='') else: if list_price[i] == zero: now = 0 # 当前为0 else: now = 1 if now == 1 or (now == 0 and list_price[i - 1] != zero and end_zero == 1): print(list_price[i], end='') if now == 1 and i != len_price - 1: # 若当前不为0 print(list_unit[len_price - i - 1], end='') print('整') Python竞猜商品价格import random n = random.randint(1, 600) # print(n) for i in range(10): m = int(input('请输入竞猜价格:')) if m < n: print('价格低了,请继续') elif m > n: print('价格高了,请继续') else: print('你真厉害,猜对了!') break if i == 9: print('本次竞猜失败,请下次努力') 编写一个函数,将黑客精英发送的信息转换为暗语输出如发送的信息中含有数字0,就把数字 0替换为暗语字母 O 。含有数字2, 2替换为暗语学母 Zdef jiami(list1, list2): list3 = [] for i in list1: list3.append(list2[int(i)]) return list3 if __name__ == '__main__': lis1 = input('请输入一组数字信息:') lis2 = ['O', 'I', 'Z', 'E', 'Y', 'S', 'G', 'L', 'B', 'P'] n = jiami(lis1, lis2) print(n) 总结:通过这几个案例对Python有了更加深刻地理解!
Python模拟斐波那契数列输出业务需求:用户输入指定的数列范围正确输出结果关键技术分析:• 使用input接受用户输入• 使用while循环实现n = int(input('请输入数列范围:')) a, b = 0, 1 while b < n: print(b) a, b = b, a+bPython九九乘法表编写程序,输出九九乘法表,如下图所示for i in range(1, 10): for j in range(1, 10): if i >= j: print(i, '*', j, '=', i*j, end=' ') print('') Python实现百钱百鸡编写程序,解决“百钱百鸡”问题。一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱。for i in range(21): for j in range(34): n = 100 - i - j # 百鸡 if i*5+j*3+n/3 == 100: # 百钱 print('公鸡有{0}只,母鸡有{1}只,小鸡有{2}只'.format(i, j, n))求 2-1000内的所有回文素数只能有1和本身整除的整数叫素数;如一个素数从左向右和从右向左是相同的数,则该素数为回文素数。for i in range(2, 1001): for j in range(2, i): if i % j == 0: break else: n = str(i) m = n[::-1] if m == n: print(i, end=' ') 计算一个人BMI(身体质量指数)指数写一个计算可以计算一个人BMI(身体质量指数)指数程序体质指数(BMI)=体重(kg)÷身高 2 (m)成人的BMI数值:过轻:低于18.5正常:18.5-23.9过重:24-27肥胖:27-32非常肥胖, 高于32weight = eval(input('请输入你的体重(单位:kg):')) height = eval(input('请输入你的身高(单位m):')) BIM = weight/pow(height, 2) if BIM < 18.5: print('过轻!') elif BIM <= 23.9: print('正常!') elif BIM <= 27: print('过重!') elif BIM <= 32: print('肥胖!') else: print('非常肥胖!') Python输出字母或数字的ASCLL值import sys n = input('请输入一位字母或数字:') m = int(ord(n)) if 48 <= m <= 57: # 数字0到9 print(m) elif 65 <= m <= 90: # 大写字母A到Z print(m) elif 97 <= m <= 122: # 小写字母a到z print(m) else: sys.exit() 利用递归实现1+2+3+…100利用递归函数。def fac(n): if n == 1: return 1 return n+fac(n-1) if __name__ == '__main__': print(fac(100))
初识OpenCV简单操作之图像处理,获取人脸特征,给图像简单的打码,绘制图形、运算、几何变换、平滑处理、边缘检测一、获取图像的感兴趣区域(1)通过像素矩阵直接得到ROI区域img[140:260,210:340](2)对图像ROI域进行赋值img[180:300,270:400] = face1获取脸部信息import cv2 img = cv2.imread('D:\opencvdata\lena.jpg') face = img[140:260,210:340] cv2.imshow('img',img) cv2.imshow('face',face) cv2.waitKey(0) cv2.destroyAllWindows()获取其他特征由此我们也可以推出,获取鼻子,眼睛,嘴巴等特征140:260为高210:340为宽import cv2 img = cv2.imread('D:\opencvdata\lena.jpg') face = img[140:260,210:340] eye = img[140:180,210:340] mouth = img[220:260,210:340] nose = img[180:220,210:340] # img[140:260,210:340] = 0 cv2.imshow('img',img) cv2.imshow('face',face) cv2.imshow('eye',eye) cv2.imshow('nose',nose) cv2.imshow('mouth',mouth) cv2.waitKey(0) cv2.destroyAllWindows()图像域赋值import cv2 img = cv2.imread('D:\opencvdata\lena.jpg') face = img[140:260,210:340] img[140:260,210:340] = 0 img[140:260,210:340] = 255 cv2.imshow('img',img) cv2.imshow('face',face) cv2.waitKey(0) cv2.destroyAllWindows()赋值为0,为黑色赋值为255,为白色对其他特征赋值,简单的打码二、绘制图形画直线cv2.line()import cv2 img = cv2.imread(r'D:\opencvdata\b.jpg') cv2.line(img,(0,0),(400,300),(0,255,0),10) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()(0,0) 开始点(400,300) 结束点(0,255,0) 颜色10 粗细画圆 cv2.circle()cv2.circle(img,(200,200),100,(0,0,255),10)(200,200) 圆心100 半径(0,0,255) 颜色10 粗细画矩形 cv2 rectal.gle()cv2.rectangle(img,(10,10),(200,200),(100,100,100),5)(10,10) 左上角(200,200) 右下角(100,100,100) 颜色5 粗细画椭圆 cv2.ellipse()cv2.ellipse(img,(300,300),(100,50),0,0,360,(0,120,80),3)(300,300) 中心(100,50) 长轴0 角度0 开始角度360 结束角度(0,120,80) 颜色3 粗细添加文字 cv2.putText()cv2.putText(img,"opencv",(300,400),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,0,255),3)"opencv",显示文本(300,400) 显示位置cv2.FONT_HERSHEY_COMPLEX,字体类型2.0,字体大小(0,0,255),字体颜色3 粗细三、图像运算图像运算就是对图像的每个像素进行处理,图像的运算包括算术运算和逻辑运算,也称为按位运算。图像的算数运算是指对多幅图你进行加、减、乘、除运算。图像的逻辑运算是指对多幅图像进行与、或、非、异或运算。注意:两个图像在进行运算时,图像的像素大小和类型要完全一致,否则opencv就会报错。图像加法运算‘+’import cv2 img1 = cv2.imread(r'D:\opencvdata\g.jpg') img2 = cv2.imread(r'D:\opencvdata\t.jpg') img3 = img2 + img1 cv2.imshow('img',img3) cv2.waitKey(0) cv2.destroyAllWindows()cv2.add(img 1,img2)大于255,对255取模;img4 = cv2.add(img1,img2)cV2.addWeighted(img1,a1pha,img2,beta,gamma)大于255,以255计数img5 = cv2.addWeighted(img1,0.3,img2,0.7,0)0.3和0.7分别为两个图像所占权重图像减法运算‘-’小于0,对255取模;img3 = img2 - img1cv2.subtract(img 1,img2)img4 = cv2.subtract(img1,img2)小于0使用0计数图像乘法运算‘*’img3 = img2 * img1 cv2.multiply(img1,img2) img4 = cv2.multiply(img1,img2)图像除法运算/img3 = img2 / img1 cv2.divide(img 1,img2) img4 = cv2.divide(img1,img2)图像按位与操作cv2.bitwise_and(img1,img2[,mask])img4 = cv2.bitwise_and(img1,img2) 图像按位或操作cv2.bitwise_or(img1,img2[,mask]) img5 = cv2.bitwise_or(img1,img2) 图像按位取反操作cv2.bitwise_not(img 1[,mask]) img6 = cv2.bitwise_not(img1) 图像按位异或操作cv2.bitwise_xor(img 1,img2[,mask]) img7 = cv2.bitwise_xor(img1,img2)更加清晰的看到效果mask = cv2.imread('D:\opencvdata\m.png',0) w,h,_ = img1.shape mask = cv2.resize(mask,(w,h)) img7 = cv2.bitwise_xor(img1,img2,mask=mask) det = cv2.bitwise_xor(img7,img2)四、图像几何变换(1)图像缩放函数:dst = cv2.resize( src, dsize[, fx, fy, interpolation])参数: src表示源图像;dsize表示目标图像大小;fx表示水平轴上的比例因子;fy表示垂直轴上的比例因子;interpolation插值方法,共有5种。interpolation 5种插值方法: 1) INTER_NEAREST-近邻插值法; 2) INTER_LINEAR-双线性插值法(默认); 3) INTER_AREA -区域插值法,基于局部像素的重采样; 4) INTER_CUBIC-三次样条插值,基于4x4像素邻域的3次插值法; 5) INTER_LANCZOS4 -基于8x8像素邻域的Lanczos插值在使用cv2.resize ()对原始图像进行缩放,当缩小图像时,使用区域插值方式(INTER_AREA)能够得到最好的效果;当放大图像时,使用三次样条插值(INTER_CUBIC)方式和双线性插值(INTER_LINEAR)方式都能够取得较好的效果。三次样条插值方式速度较慢,双线性插值方式速度相对较快且效果并不差。dst = cv2.resize(img,(1000,500),cv2.INTER_AREA)dst = cv2.resize(img,None,fx=0.2,fy=0.3)(2)图像翻转函数: dst = cV2.flip( src, flipCode )参数: src表示源图像;flipCode表示翻转方式;0绕x轴翻转;1绕y轴翻转;-1绕x,y轴同时翻转。import cv2 img = cv2.imread('D:\opencvdata\g.jpg') dst1 = cv2.flip(img,1) dst2 = cv2.flip(img,0) dst3 = cv2.flip(img,-1) cv2.imshow('img',img) cv2.imshow('dst1',dst1) cv2.imshow('dst2',dst2) cv2.imshow('dst3',dst3) cv2.waitKey(0) cv2.destroyAllWindows()五、图像平滑在保留图像原有信息的基础上,过滤并去除掉图像中的噪声,这一过程就是图像的平滑处理,所得图像被称为平滑图像。平滑处理的基本原理是:将噪声点的像素值处理为其周围临近像素点像素值的临近值。取近似值的方法很多,主要有如下的几种方法:均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波、2D卷积。cv2. GaussianBlur (img, ksize, sigmaX)参数:img输入原图;ksize 高斯内核大小sigmaX X方向上的高斯核标准偏差import cv2 img = cv2.imread(r'D:\opencvdata\noise.png') img2 = cv2.GaussianBlur(img,(7,7),0) cv2.imshow('img',img) cv2.imshow('img2',img2) cv2.waitKey(0) cv2.destroyAllWindows()六、图像边缘检测边缘是指图像中图像像素值变化明显的位置。这些变化明显的位置常常是图像中需要关注的位置,对这些关键位置的检测,就叫做边缘检测。如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值的变化趋势可以用函数的导数描述。因此可以通过寻找导数值较大的区域去寻找函数中突然变化的区域,进而确定图像中的边缘位置。通常我们可以把边缘检测分为以下三个类型:(1)通过计算图像的梯度值来检测图像的边缘,如Sobel算子、Prewitt算子、Roberts算子及差分过缘检测(2)通过寻求二阶导数中的过零点来检测边缘,如拉普拉斯算子、高普拉普拉斯算子、Canny算子边缘检测。(3)混合一阶与二阶微分为基础的边缘检测,综合利用一阶微分与二阶微分特征,如Marr-Hildreth边缘检测算子。cv2. Canny (img, thresholdl, threshold2)参数: img输入原图threshold1 國值1threshold2 國值2import cv2 img = cv2.imread(r'D:\opencvdata\g.jpg') img2 = cv2.Canny(img,50,200) cv2.imshow('img',img) cv2.imshow('img2',img2) cv2.waitKey(0) cv2.destroyAllWindows()类似素描了!
2023年05月
2023年01月
2022年09月
2022年08月
2022年07月
2022年06月
2022年05月
你收到过什么周边? 我收到过乘风者计划的小米鼠标、开发者大礼包(充电宝、手机支架、蓝牙耳机、充电线)、专家博主证书、云小宝。 你觉得哪些周边符合开发者气质? 开发者大礼包。 有什么周边让你眼前一亮,觉得很棒? 专家博主证书,非常大气上档次! 你对商城周边上新有什么建议? 希望多一点定制手机壳,U盘,电脑支架,! 对于社区周边联名你有什么好的idea? 联名定制一些T恤,套装,鞋子之类的,这样穿在身上不仅回头率高还能多多宣传阿里云,吸引更多的开发者用户!