首页 文章 精选 留言 我的

精选列表

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

kubernetes集群全监控报警方案kube-prometheus

参考文档 http://www.servicemesher.com/blog/prometheus-operator-manual/ https://github.com/coreos/prometheus-operator https://github.com/coreos/kube-prometheus 背景环境 kubernetes集群1.13版本,纯二进制版本打造,参考k8s1.13集群部署 coreos/kube-prometheus从coreos/prometheus-operator独立出来了,后续entire monitoring stack只能去coreos/kube-prometheus 目前在该环境下部署还没有遇到坑 监控原理 Prometheus读取Metrcs,读取etcd或者api的都行 查看etcd的metrics输出信息 [root@elasticsearch01 yaml]# curl --cacert /k8s/etcd/ssl/ca.pem --cert /k8s/etcd/ssl/server.pem --key /k8s/etcd/ssl/server-key.pem https://10.2.8.34:2379/metrics 查看kube-apiserver的metrics信息 [root@elasticsearch01 yaml]# kubectl get --raw /metrics 实施部署 注意:This will be the last release supporting Kubernetes 1.13 and before. The next release is going to support Kubernetes 1.14+ only.后续版本只支持k8s1.14+,所以后续要下载release版本,目前只有一个版本所以可以直接git clone 1.下载原代码 [root@elasticsearch01 yaml]# git clone https://github.com/coreos/kube-prometheus Cloning into 'kube-prometheus'... remote: Enumerating objects: 5803, done. remote: Total 5803 (delta 0), reused 0 (delta 0), pack-reused 5803 Receiving objects: 100% (5803/5803), 3.69 MiB | 536.00 KiB/s, done. Resolving deltas: 100% (3441/3441), done. 2.查看原配置文件 [root@elasticsearch01 yaml]# cd kube-prometheus/manifests [root@elasticsearch01 manifests]# ls 00namespace-namespace.yaml 0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml 0prometheus-operator-0prometheusCustomResourceDefinition.yaml 0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml 0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml 0prometheus-operator-clusterRoleBinding.yaml 0prometheus-operator-clusterRole.yaml 0prometheus-operator-deployment.yaml 0prometheus-operator-serviceAccount.yaml 0prometheus-operator-serviceMonitor.yaml 0prometheus-operator-service.yaml alertmanager-alertmanager.yaml alertmanager-secret.yaml alertmanager-serviceAccount.yaml alertmanager-serviceMonitor.yaml alertmanager-service.yaml grafana-dashboardDatasources.yaml grafana-dashboardDefinitions.yaml grafana-dashboardSources.yaml grafana-deployment.yaml grafana-serviceAccount.yaml grafana-serviceMonitor.yaml grafana-service.yaml kube-state-metrics-clusterRoleBinding.yaml kube-state-metrics-clusterRole.yaml kube-state-metrics-deployment.yaml kube-state-metrics-roleBinding.yaml kube-state-metrics-role.yaml kube-state-metrics-serviceAccount.yaml kube-state-metrics-serviceMonitor.yaml kube-state-metrics-service.yaml node-exporter-clusterRoleBinding.yaml node-exporter-clusterRole.yaml node-exporter-daemonset.yaml node-exporter-serviceAccount.yaml node-exporter-serviceMonitor.yaml node-exporter-service.yaml prometheus-adapter-apiService.yaml prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml prometheus-adapter-clusterRoleBindingDelegator.yaml prometheus-adapter-clusterRoleBinding.yaml prometheus-adapter-clusterRoleServerResources.yaml prometheus-adapter-clusterRole.yaml prometheus-adapter-configMap.yaml prometheus-adapter-deployment.yaml prometheus-adapter-roleBindingAuthReader.yaml prometheus-adapter-serviceAccount.yaml prometheus-adapter-service.yaml prometheus-clusterRoleBinding.yaml prometheus-clusterRole.yaml prometheus-prometheus.yaml prometheus-roleBindingConfig.yaml prometheus-roleBindingSpecificNamespaces.yaml prometheus-roleConfig.yaml prometheus-roleSpecificNamespaces.yaml prometheus-rules.yaml prometheus-serviceAccount.yaml prometheus-serviceMonitorApiserver.yaml prometheus-serviceMonitorCoreDNS.yaml prometheus-serviceMonitorKubeControllerManager.yaml prometheus-serviceMonitorKubelet.yaml prometheus-serviceMonitorKubeScheduler.yaml prometheus-serviceMonitor.yaml prometheus-service.yaml 3.新建目录重新梳理下 [root@elasticsearch01 manifests]# mkdir -p operator node-exporter alertmanager grafana kube-state-metrics prometheus serviceMonitor adapter [root@elasticsearch01 manifests]# mv *-serviceMonitor* serviceMonitor/ etheus/[root@elasticsearch01 manifests]# mv 0prometheus-operator* operator/ [root@elasticsearch01 manifests]# mv grafana-* grafana/ [root@elasticsearch01 manifests]# mv kube-state-metrics-* kube-state-metrics/ [root@elasticsearch01 manifests]# mv alertmanager-* alertmanager/ [root@elasticsearch01 manifests]# mv node-exporter-* node-exporter/ [root@elasticsearch01 manifests]# mv prometheus-adapter* adapter/ [root@elasticsearch01 manifests]# mv prometheus-* prometheus/ [root@elasticsearch01 manifests]# ls 00namespace-namespace.yaml alertmanager kube-state-metrics operator serviceMonitor adapter grafana node-exporter prometheus [root@elasticsearch01 manifests]# ls -lh total 36K -rw-r--r-- 1 root root 60 Jun 3 20:05 00namespace-namespace.yaml drwxr-xr-x 2 root root 4.0K Jun 4 14:23 adapter drwxr-xr-x 2 root root 4.0K Jun 4 14:23 alertmanager drwxr-xr-x 2 root root 4.0K Jun 4 14:23 grafana drwxr-xr-x 2 root root 4.0K Jun 4 14:23 kube-state-metrics drwxr-xr-x 2 root root 4.0K Jun 4 14:23 node-exporter drwxr-xr-x 2 root root 4.0K Jun 4 14:23 operator drwxr-xr-x 2 root root 4.0K Jun 4 14:23 prometheus drwxr-xr-x 2 root root 4.0K Jun 4 14:23 serviceMonitor 4.部署前注意问题a.镜像问题其中k8s.gcr.io/addon-resizer:1.8.4镜像下载不了,需要借助阿里云中转下,其他镜像默认都能下载,如遇到不能下载的也需要中转下再tag到自己私有镜像库 [root@VM_8_24_centos ~]# docker pull registry.cn-beijing.aliyuncs.com/minminmsn/addon-resizer:1.8.4 1.8.4: Pulling from minminmsn/addon-resizer 90e01955edcd: Pull complete ab19a0d489ff: Pull complete Digest: sha256:455eb18aa7a658db4f21c1f2b901c6a274afa7db4b73f4402a26fe9b3993c205 Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/minminmsn/addon-resizer:1.8.4 [root@VM_8_24_centos ~]# docker tag registry.cn-beijing.aliyuncs.com/minminmsn/addon-resizer:1.8.4 core-harbor.minminmsn.com/public/addon-resizer:1.8.4 [root@VM_8_24_centos ~]# docker push core-harbor.minminmsn.com/public/addon-resizer:1.8.4 The push refers to repository [core-harbor.minminmsn.com/public/addon-resizer] cd05ae2f58b4: Pushed 8a788232037e: Pushed 1.8.4: digest: sha256:455eb18aa7a658db4f21c1f2b901c6a274afa7db4b73f4402a26fe9b3993c205 size: 738 b.访问问题grafana,prometheus,alermanager等如果不想使用ingres方式访问就需要使用nodeport方式,否则对外不好访问nodeport方式需在service配置文件,如grafana/grafana-service.yaml 添加type: NodePort,如果要指定node对外端口,需要加配nodePort: 33000,具体可以看配置文件ingress方式也需要配置文件,ingress配置文件见最后访问配置文件,ingress部署参考k8s集群部署ingress 5.应用部署 [root@elasticsearch01 manifests]# kubectl apply -f . namespace/monitoring created [root@elasticsearch01 manifests]# kubectl apply -f operator/ customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created clusterrole.rbac.authorization.k8s.io/prometheus-operator created clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created deployment.apps/prometheus-operator created service/prometheus-operator created serviceaccount/prometheus-operator created [root@elasticsearch01 manifests]# kubectl -n monitoring get pod NAME READY STATUS RESTARTS AGE prometheus-operator-7cb68545c6-z2kjn 1/1 Running 0 41s [root@elasticsearch01 manifests]# kubectl apply -f adapter/ apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created clusterrole.rbac.authorization.k8s.io/prometheus-adapter created clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created clusterrolebinding.rbac.authorization.k8s.io/prometheus-adapter created clusterrolebinding.rbac.authorization.k8s.io/resource-metrics:system:auth-delegator created clusterrole.rbac.authorization.k8s.io/resource-metrics-server-resources created configmap/adapter-config created deployment.apps/prometheus-adapter created rolebinding.rbac.authorization.k8s.io/resource-metrics-auth-reader created service/prometheus-adapter created serviceaccount/prometheus-adapter created [root@elasticsearch01 manifests]# kubectl apply -f alertmanager/ alertmanager.monitoring.coreos.com/main created secret/alertmanager-main created service/alertmanager-main created serviceaccount/alertmanager-main created [root@elasticsearch01 manifests]# kubectl apply -f node-exporter/ clusterrole.rbac.authorization.k8s.io/node-exporter created clusterrolebinding.rbac.authorization.k8s.io/node-exporter created daemonset.apps/node-exporter created service/node-exporter created serviceaccount/node-exporter created [root@elasticsearch01 manifests]# kubectl apply -f kube-state-metrics/ clusterrole.rbac.authorization.k8s.io/kube-state-metrics created clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created deployment.apps/kube-state-metrics created role.rbac.authorization.k8s.io/kube-state-metrics created rolebinding.rbac.authorization.k8s.io/kube-state-metrics created service/kube-state-metrics created serviceaccount/kube-state-metrics created [root@elasticsearch01 manifests]# kubectl apply -f grafana/ secret/grafana-datasources created configmap/grafana-dashboard-k8s-cluster-rsrc-use created configmap/grafana-dashboard-k8s-node-rsrc-use created configmap/grafana-dashboard-k8s-resources-cluster created configmap/grafana-dashboard-k8s-resources-namespace created configmap/grafana-dashboard-k8s-resources-pod created configmap/grafana-dashboard-k8s-resources-workload created configmap/grafana-dashboard-k8s-resources-workloads-namespace created configmap/grafana-dashboard-nodes created configmap/grafana-dashboard-persistentvolumesusage created configmap/grafana-dashboard-pods created configmap/grafana-dashboard-statefulset created configmap/grafana-dashboards created deployment.apps/grafana created service/grafana created serviceaccount/grafana created [root@elasticsearch01 manifests]# kubectl apply -f prometheus/ clusterrole.rbac.authorization.k8s.io/prometheus-k8s created clusterrolebinding.rbac.authorization.k8s.io/prometheus-k8s created prometheus.monitoring.coreos.com/k8s created rolebinding.rbac.authorization.k8s.io/prometheus-k8s-config created rolebinding.rbac.authorization.k8s.io/prometheus-k8s created rolebinding.rbac.authorization.k8s.io/prometheus-k8s created rolebinding.rbac.authorization.k8s.io/prometheus-k8s created role.rbac.authorization.k8s.io/prometheus-k8s-config created role.rbac.authorization.k8s.io/prometheus-k8s created role.rbac.authorization.k8s.io/prometheus-k8s created role.rbac.authorization.k8s.io/prometheus-k8s created prometheusrule.monitoring.coreos.com/prometheus-k8s-rules created service/prometheus-k8s created serviceaccount/prometheus-k8s created [root@elasticsearch01 manifests]# kubectl apply -f serviceMonitor/ servicemonitor.monitoring.coreos.com/prometheus-operator created servicemonitor.monitoring.coreos.com/alertmanager created servicemonitor.monitoring.coreos.com/grafana created servicemonitor.monitoring.coreos.com/kube-state-metrics created servicemonitor.monitoring.coreos.com/node-exporter created servicemonitor.monitoring.coreos.com/prometheus created servicemonitor.monitoring.coreos.com/kube-apiserver created servicemonitor.monitoring.coreos.com/coredns created servicemonitor.monitoring.coreos.com/kube-controller-manager created servicemonitor.monitoring.coreos.com/kube-scheduler created servicemonitor.monitoring.coreos.com/kubelet created 6.检查验证 [root@elasticsearch01 manifests]# kubectl -n monitoring get all NAME READY STATUS RESTARTS AGE pod/alertmanager-main-0 2/2 Running 0 91s pod/alertmanager-main-1 2/2 Running 0 74s pod/alertmanager-main-2 2/2 Running 0 67s pod/grafana-fc6fc6f58-22mst 1/1 Running 0 89s pod/kube-state-metrics-8ffb99887-crhww 4/4 Running 0 82s pod/node-exporter-925wp 2/2 Running 0 89s pod/node-exporter-f45s4 2/2 Running 0 89s pod/prometheus-adapter-66fc7797fd-x6l5x 1/1 Running 0 90s pod/prometheus-k8s-0 3/3 Running 1 88s pod/prometheus-k8s-1 3/3 Running 1 88s pod/prometheus-operator-7cb68545c6-z2kjn 1/1 Running 0 12m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/alertmanager-main ClusterIP 10.254.83.142 <none> 9093/TCP 91s service/alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 91s service/grafana NodePort 10.254.162.5 <none> 3000:33000/TCP 89s service/kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 90s service/node-exporter ClusterIP None <none> 9100/TCP 90s service/prometheus-adapter ClusterIP 10.254.123.201 <none> 443/TCP 91s service/prometheus-k8s ClusterIP 10.254.51.81 <none> 9090/TCP 89s service/prometheus-operated ClusterIP None <none> 9090/TCP 89s service/prometheus-operator ClusterIP None <none> 8080/TCP 12m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/node-exporter 2 2 2 2 2 beta.kubernetes.io/os=linux 90s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/grafana 1/1 1 1 89s deployment.apps/kube-state-metrics 1/1 1 1 90s deployment.apps/prometheus-adapter 1/1 1 1 91s deployment.apps/prometheus-operator 1/1 1 1 12m NAME DESIRED CURRENT READY AGE replicaset.apps/grafana-fc6fc6f58 1 1 1 89s replicaset.apps/kube-state-metrics-68865c459c 0 0 0 90s replicaset.apps/kube-state-metrics-8ffb99887 1 1 1 82s replicaset.apps/prometheus-adapter-66fc7797fd 1 1 1 91s replicaset.apps/prometheus-operator-7cb68545c6 1 1 1 12m NAME READY AGE statefulset.apps/alertmanager-main 3/3 91s statefulset.apps/prometheus-k8s 2/2 89s 7.ingress配置 [root@elasticsearch01 manifests]# cat ingress-monitor.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: prometheus-ing namespace: monitoring spec: rules: - host: prometheus-k8s.minminmsn.com http: paths: - backend: serviceName: prometheus-k8s servicePort: 9090 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: grafana-ing namespace: monitoring spec: rules: - host: grafana-k8s.minminmsn.com http: paths: - backend: serviceName: grafana servicePort: 3000 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: alertmanager-ing namespace: monitoring spec: rules: - host: alertmanager-k8s.minminmsn.com http: paths: - backend: serviceName: alertmanager-main servicePort: 9093 [root@elasticsearch01 manifests]# kubectl apply -f ingress-monitor.yaml ingress.extensions/prometheus-ing created ingress.extensions/grafana-ing created ingress.extensions/alertmanager-ing created 浏览器访问 1.nodeport方式访问http://10.2.8.65:33000 2.ingress方式访问http://grafana-k8s.minminmsn.com默认账号密码admin admin需要重置密码进入

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

Python全 Web(Django框架、HttpRequest,csrf跨域攻击)

Djanog 的ORM 自定义查询对象 - objects 声明一个类 EntryManager 继承自models.Manager 允许在EntryManager 的类中添加自定义函数 class EntryManager(models.Manager): def 函数名(self, 自定义参数列表): ... return ... 使用EntryManager 来覆盖 Models类中原有的objects #自定义AuthorManager类,用于覆盖Author实体类中的objects class AuthorManager(models.Manager): def age_lt

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

Python全 Web(Ajax JQuery-AJAX 跨域请求)

jQuery对AJAX的支持 $.ajax() 语法: $.ajax({请求参数的json对象}); 请求参数对象的属性: URL:字符串 表示异步请求地址 type:字符串 请求方式 get或post date:传递到服务端的参数 参数字符串("name=dfh&age15")或json datetype:响应回来的数据格式 HTML xml text script json jsonp:有关跨域的响应了格式 success: 回调函数 响应成功后的回调函数 error: 回调函数 请求或响应失败时的回调函数 beforSend: 回调函数 发送AJAX请求之前的回调函数 如果return False 则终止请求发送 <!DOCTYPE html> <html lang="en"> <

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

Python全 Web(JavaScript DOM树、DOM对象、BOM对象)

外部对象: BOM和DOM BOM: Browser Object Module 浏览器对象模型 将浏览器比喻成一个对象-window (网页初始化自动创建) 可以通过window对象操作浏览器 DOM: Document Object Module 文档对象模型 将HTML文档比喻成一个对象-document( 是window的一个属性) 可以灵活的操作网页上的内容 window对象(BOM模型): 表示浏览器 window下的属性和方法在使用时 可以省略window.直接去调用 例如: window.alert() --> alert() window.prompt()-->pormpt() ... window中的对话框: 警告框: window.alert()/alert() 输入框: window.prompt()/prompt() 确认框: window.

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

Python全 Web(JavaScript 运算符、流程控制)

运算符: 赋值运算符:= 算术运算符:+ - * / % 自增自减:++ -- 自增自减在单独使用时放前放后没区别 如果参与其他运算时分前缀和后缀 ++ 在后 先使用后自增 ++ 在前 先自增后使用 关系运算符 >、 >=、 <、 <=、 ==、 != ===全等/恒等 !==不全等/不恒等 关系运算符的结果都为boolean类型 数字与字符串进行比较: 实现自动转换数据类型在比较 如果转换成功 按照数字比较 失败会变成NaN与数字比较 永远都是false 字符串之间的比较: 每个字符分别按照Unicode编码比较大小 如果当前字符相同进行后移 不相同直接出结果 == != 先进行数据转换后进行比较 只进行值得比较 === !== 直接进行数据比较 进行数据转换 同时判断数据类型和值是否完全相等 逻辑运算符: !非 对现有条件进行取反 非真

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

Python全 Web(CSS样式表、选择器)

CSS层叠样式表: (Cascading Style Sheet) 作用: 装饰和美化页面元素,实现网页的排版布局 CSS为HTML标记语言提供了一种样式描述,定义了其中元素的显示方式。 CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素 CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力 使用: 1.行内样式/内联样式: 特点: 在具体的标签中使用参style属性,引入CSS的样式的代码 语法: <标签 style=“CSS” 样式声明> 1)样式声明/CSS语句: 对当前元素添加样式 语法: CSS属性:值; 2) CSS的样式声明可以是多条 <标签 style=“属性:值; 属性:值;”> 常见的CSS属性: 1》.设置字体大小 属性: funt-size 取值: 以像素为单位的数值 默认16px 2》.设置字体颜色 属性: color 取值: 颜色的英文单词 3》.设置背景颜色: 属性: background-color 取值: 颜色的英文单词 2.文档内嵌/内部样式表: 特点: 将CSS代码与具体的标签相分离,在HTML文档中使用<style></style>标签引入CSS代码 语法: <style> 选择器1 选择器2 选择器3 ... </syle> 选择器: 使用文档内嵌方式引入CSS样式表时,实现了结构与样式分离 凡是需要自己定义选着器来匹配文档中元素 与其他应用样式 作用: 匹配文档原数为其应用样式 语法: 选择器实际上由两部分组成 选择器(符){ 属性:值; 属性:值; } 标签选择器/元素选择器: 使用标签名作为选择符,匹配文档中所有的标签,并应用样式 注意: <style></style> 可以写在任意位置 但是基于样式的优先原则,一般写在head里 3.外链方式/外部样式表: 定义外部的.css文件,在HTML中引入即可 真正实现文档与样式表的分离 语法: 在外部样式表中使用选着器来定义样式: 在HTML中用<link>引入CSS文件 样式表的特征: 继承性: 大部分的CSS属性都是可以被继承的 子元素或后代元素都是可继承父元素中的样式的 所有的文本属性都可以被继承 块元素的宽度与父元素保持一致 层叠性: 允许为元素定义多个样式,共同起作用 样式表的优先级: 低~高 1.浏览器的缺省设置:浏览器默认样式 2.文档内嵌/外链方式:在不发生样式冲突时:共同起作用,不冲突时:后来者居上 3.行内样式的优先级最高 CSS的选着器: 作用: 规范页面中哪些元素能够应用声明好的样式 目的: 匹配页面原素 详解: 1.标签选择器/元素选择器: 特点: 将标签名作为选择符,来匹配文档中所有的该标签,包含后代元素 语法: p{ color: red; text-decoration: none; } 2.类选择器: 特点: 通过元素的class属性值进行匹配 语法: .c1{ 样式 } <p class="c1">文本</p> 类选择器的结合使用: 1. 标签名.类名 表示在指定的标签中匹配的class属性值对应的元素 标签名一定要写在前面 语法: p.c1{ 样式 } 2. .类名1.类名2(不常用) 3. 标签中使用两个选择器的样式 语法: <p class="类名1 类名2"> 3. ID 选择器: 作用: HTML中所有的元素都有一个ID属性,主要用来表示元素在文档中的标志具有唯一性 通过元素的ID属性值进行匹配 *通常网页中外围的结构化标签。都使用ID进行标识 具有唯一性 语法: #nav{ 样式 } <div id="nav">导航条</div> 4.群组选择器: 作用: 为多个选择器设置共同的样式 语法: div,h1,...{ 样式 } <div></div> <h1></h1> ... 5.后代选择器: 作用: 依托于元素的后代关系匹配元素 既包含直接子元素和后代子元素 语法: 选择器1 选择器2..{ 样式 } 在选择器1对应的元素匹配后代元素,后代元素必须满足选择器2 6.子代选择器: 作用: 依托元素的子代关系进行匹配 只匹配直接子元素 语法: 选择器1>选择器2{ 样式 } 在选择器1对应的元素中匹配直接子元素 7.伪类选择器: 1)超链接伪类选择器 2)动态伪类选择器 主要针对元素的不同状态去设置样式 超链接的不同状态 访问前:link 访问后:visited 激活(鼠标按住不放):active 鼠标滑过:hover 其他元素: 鼠标滑过 激活 表单控件: 获取焦点时的状态:focus 对密码框和文本框而言 当用户输入时都视为获取焦点 3)与其他选择器结合使用 设置元素在不同状态下的样式 语法: a:link{ color:black; } 如果要给超链接添加伪类选择器 必须按照以下顺序书写 link visited hover active 选择器的优先级: 当多个选择器的样式同时应用到一个元素上时 要按照不同选择器的优先级来应用样式 判断选择器的优先级 主要看选择器的权重(权值) 选择器 权值 标签选择器 1 类选择器/伪类 10 id选择器 100 行内选择器 1000 如果是复杂选择器(后代,子代) 最终权值是是各选择器之和 尺寸单位与颜色取值 尺寸单位 px 像素单位 默认单位 % 参照父元素对应属性的值进行获取 in inch 英寸 1in = 2.54cm pt 榜 1pt = 1/72 in cm mm 颜色单位 1.英文单词 2.rgb(r,g,b) 表示颜色 取值: 每一种三原色的取值范围:0~255 3.rgba(r,g,b,alpha) 设置颜色 还可以调整透明度 三原色的取值范围:0~255 alpha透明度取值:1/0 0:表示透明 1:表示不透明 取小数表示半透明。整数的0可以省略不写 0.5/.5 4.十六进制表示颜色: 三原色的取值为0~255 取值转换为十六进制 表示颜色: 长十六进制 6位表示方法 每两位为一组 代表一种三原色 #ff0000表示红色 短十六进制 3位表示 浏览器会自动对每一位进行重复补全,最终补全为十六进制 元素分类 HTML中标签分为 1. 块元素 特点 : 1. 独占一行,不与其他元素共行显示 2. 可以手动设置宽高 et : div h1 p ul ol table form 2. 行内元素 特点 : 1. 可以与其他元素或者文本共行显示 2. 不能手动设置宽高,元素的大小由内容决定 et : span i b label u s sub sup 3. 行内块元素 特点 : 既可以与其他元素共行显示,也可以手动设置宽高 et : img input 属性 : 可以通过 vertical-align设置行内块元素左右元素与其的垂直对齐方式 取值 : top / middle / bottom 注意 :vertical-align只在行内块元素中使用 行内元素是可以共行显示的,但是如果代码中出现了换行,页面最终效果上,行内元素之间会有空隙

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

Python全 项目(电子词典、协程、pdb调试)

什么是项目? 软件项目 : 实现一定完整性功能的代码 软件项目的开发流程 需求分析 概要设计 项目规划 详细设计 编码测试 项目测试 调试修改 项目发布 后期维护更新 需求分析 : 确定用户的真实需求 1. 确定用户的真实需求,即项目的基本功能 2. 对项目的难度和可行性进行分析 3. 完成需求分析文档,进行确认 概要设计 : 对项目进行整体分析,初步确定技术方向 1. 整体设计,确定项目架构 2. 确定项目功能模块划分 3. 确定大的技术方向 4. 编写项目概要设计文档,开发流程图 项目规划 : 确定项目分工,按照项目时限进行规划 1. 确定开发顺序 2. 确定开发的时间轴和里程碑 3. 人员的分配 4. 完成甘特图和思维导图指导开发 详细设计 : 项目具体的开发设计,完成设计手册 1.根据开发内容,形成详细设计文档 思路, 逻辑流程 ,功能说明,技术点说明,数据结

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

Python全 MongoDB 数据库(概念、安装、创建数据)

什么是关系型数据库? 是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据, 同时也是一个被组织成一组拥有正式描述性的表格(二维表),该形式的表格作用的实 质是装载着 数据项 的特殊收集体,这些表格中的数据能以许多不同的方式被存 取或重新召集而不需要重新组织数据库表格(即表与表之间的联系)。 nosql和关系型数据库比较? 优点: 1)成本:nosql数据库简单易部署,基本都是开源软件, 不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。 2)查询速度:nosql数据库将数据存储于缓存之中, 关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。 3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、 图片形式等等, 所以可以存储基础类型以及对象或者是集合等各种 格式,而关系数据库则只支持基础类型。 4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。 缺点: 1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。 2)不提供对sql语句的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。 3)不提供关系型数据库对事物的处理。 MongoDB简介: MongoDB是一个非关系型数据库 他是NOSQL数据库技术相对成熟的一个文档型数据库 MongoDB的数据管理系统是由C++语言编写的 MongoDB支持丰富的增删改查功能并且支持 关系型所没有的更多数据类型 虽然支持丰富的增删改查但是他不支持SQL语句 MongoDB有着丰富的编程语言接口 例如:Python、PHP、C++、JavaScript、C#等 MongoDB也被誉为着最像关系型数据库的NoSQL MongoDB(芒果数据库) 数据存储发展阶段: 文件管理阶段(.txt、.doc、.xls....) 优点: 数据可以长期保存 有一定的格式化规范 可以大量存储 使用简单方便 缺点: 数据一致性差 用查找修改不方便 数据冗余 数据库管理阶段: 优点: 数据组织结构化 降低了冗余 提高了增删改查的效率 便于扩展 方便程序调试做自动化管理 缺点: 数据库的使用专业性较强 相对比较复杂 基本概念 什么是数据: 能够输入到 计算机中并被 识别处理的信息的集合 数据结构: 相互之间存在着一种或多种关系的 数据 元素的集合和该集合中数据 元素 之间的关系组成 数据库: 按照数据结构, 存储管理数据的 厂库 是在数据管理系统软件管理和控制下创建在一定介质上的 数据集合 数据管理系统: 数据管理 软件 用于维护管理数据库 数据库系统: 由数据库、数据管理系统,开发工具等组成的 工具集合 关系型数据库: 采用关系模型来组织数据结构的数据库(关系模型:二维表) Oracle(甲骨文)、DB2(IBM)、SQL_Server(微软)、MySQL、Sqlite Sqlite: 唯一不需要安装第三方包就可以用的数据库 用于嵌入式 小形数据库 优点: 容易理解 逻辑类似常见 表格 使用方便 都使用SQL语句 SQL语句本身非常成熟 数据 一致性高 冗余低 完整度高 技术成熟 可以使用 外部链接等复杂操作 缺点: 每次操作都需要SQL语句解析, 消耗较大 不能很好的 满足并发需求,应对海量数据爆发力不从心 关系型数据内存存在大量的 加锁操作,读写能力受到限制 数据 不够灵活,有时会有空间数据结构复杂化,造成浪费 非关系型数据库(NoSQL:Not only SQL) 优点: 高并发 读写能力强 扩展性强,使用 灵活 优化数据结构, 降低数据一致性 可以做 内存缓存 缺点: 通用性差, 没有SQL操作统一的操作语句 操作灵活 统一混乱 没有join的复杂操作,版本更新快 NoSQL的使用情况: 1.数据一致性 要求低 2.处理数据的 海量并发 3.数据库大小不能确定 需要 分布扩展 4.给定的 数据结构建立非关系模型更加 容易 NoSQL分类: 键值数据库 Redis 列存储数据库 文档数据库 MongoDB 图形数据库 MongoDB数据库: 非关系型数据库 文档型 数据库 1.由 C++编写的数据管理系统 2.支持丰富的 增删改查功能 3.支持 丰富的数据类型 4.支持 众多的 编程语言 接口(Python、PHP、C++、JS、C#) 5.在 NoSQL中技术相对比 较成熟 MongoDB的安装: 自动安装: sudo apt-get install mongodb 默认安装路径: /var/lib/mongodb 配置文件: /etc/mongodb.conf 命令集: /usr/bin 或 /usr/local/bin 手动安装: 1.下载合适版本:www.mongodb.com 2.选择合适位置 解压: /usr/local 或 /opt 3. 将bin文件夹下的 命令集加入到 环境变量 PATH = $PATH:/opt/mongodb/bin export PATH 永久设置:可以将以上两句写入 /etc/rc.local 4.重启系统 whereis 软件名: 查看一个软件的 路径 Mongodb命令: 设置数据库存储的位置: mongod --dbpath 目录 设置数据库端口: mongod --port 8080 默认 27017 mongodb的交互模式,操作数据库: mongo 进入mongo shell MongoDB的数据组成结构: 键值对 组成 文档 文档 组成 集合 集合 组成 数据库 关系形数据库与非关系型数据库 存储数据对比 -------------------------- ID | name | age -------------------------- 1 | Lily | 17 -------------------------- 2 | Lucy | 18 -------------------------- { "_id":1, "name":"Lily", "age":17 }, { "_id":2, "name":"Lucy", "age":18 } 概念对比: MySQL MongoDB 含义 database database 数据库 table collection 表/集合 column filed 字段/域 row document 记录/文档 index index 索引 创建库: use databaseName 创建一个stu的数据库 use stu 实际 use是 选择使用哪个数据库,当选者使用的数据库 不存在时就会自动化创建 只有向数据库 插入数据时才会真实被 创建出来 而use后不会马上被创建 查看库: show dbs 数据库命名: 1.使用UTF-8字符 2.不能含有 . 、 / 、 \ 、"\0" 字符 3.长度不能超过64字节 4.不能和系统数据库重名 习惯上使用小写字母命名 系统数据库: admin:存放用户和权限 local:存放本地化数据(不让被共享) config:存储分片信息 db: mongo系统 全局变量。 绑定当前正在使用的数据库对象 当不使用 use选择任何数据库时, db表示test 此时 插入数据会创建test数据库 数据库备份和恢复: 备份: mongodump -h 主机地址 -d 库名 -o 文件名 恢复: mongorestore -h 主机地址: 端口号 -d 库名 文件路径 如果库 不存在会 自动创建库 数据库的监测: mongostat insert query update delete :每秒增查改删的次数 command 每秒运行命令的次数 flushes 每秒和磁盘的交互次数 vsize 使用虚拟内存的大小 mongotop 监测每个数据 读写时长 ns 数据集合 total 总时长 read 读时长 write 写时长 删除数据库 db.dropDatabase() 删除db所代表的数据库 创建集合: db.createCollection(“集合名”) 向集合中 插入数据时 如果这个集合不存在会 自动创建 db.集合名.insert(...) 查询集合: show collections show tables 集合命名规则: 1.合法的UTF-8字符串 2.不能有“\0” 3.不能以system. 开头 是系统保留前缀 4.不能和关键字重名 删除集合: db.集合名.drop() 集合的 重命名: db.集合名.renameCollion("新集合名") 文档: MongoDB中的数据组织形式 MongoDB文档: 以键值对的形式组成的类似于字典的数据结合 是对数据的一种描述 键: 即文档的域 命名规则: 1.utf-8字符串 2.不能有“\0” 3.一个文档中键不能重复 文档中键值对是有序的 mongodb 严格区分大小写 值: 即文档存储的数据 也就是mongodb支持的数据类型 值类型: 整型数 1 2 3 -1 -2 布尔类型 true false 浮点型 3.1415926 Array 数组[1,2,3] Timestamp 时间戳 Data 时间日期 Object 内部文档 Null 空值 String 字符串 Symbol 特殊字符串 binary data二进制字符串 code 代码 regex 正则表达式 ObjectID ObjectID对象 ObjectID: 如果在插入文档时 没有指定_id域,则系统会 自动添加该域作为主键 值则是在一个ObjectID类型数据 "_id" : ObjectId("5b764646d4ff0ad8f415f977") 24 位 16进制数 --> 保证所有的_id值的唯一性 8位的文档创建时间 6位机器ID 4位进程id 6位计数器 集合中的文档: 1.集合中的文档 不一定域的个数相同 2.集合中的文档 不一定有相同的域 关系型数据库中由表决定字段 MongoDB数据库中由文档决定域 集合设计原则: 集合的文档应该 尽可能的描述同 一类内容,有更多相同的域 同一类数据信息, 尽量不要过多的 分散集合存放 集合中文档的 层次不要包含 太多 插入文档: db.集合名.insert({name:"tom", age: 15}) save插入文档: db.集合名.save({name:"tom", age: 15}) 插入文档时的键可以不加引号 _id为系统自动天机为主键,如果自己写也可以,但是不能重复 插入多条文档: db.集合名.insert([{name:"tom", age: 15}, {}, {}...]) save插入文档: db.集合名.save([{name:"tom", age: 15}], {}...) 注: 如果不使用 _id则 save用法同 insert一样 如果加入 _id项 此时该文档已经存在是则 会覆盖原有文档

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

Python全 MySQL 数据库 (索引、数据导入、导出)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 表字段重命名(change) alter table 表名 change 原名 新名 数据类型; SQL查询 执行顺序: 3. select ...聚合函数 from 表名 1. where ... 2. group by... 4. having... 5. order by... 6. limit... group by 语句 作用:给查询结果进行 分组 注意: 1. group by之后的 字段必须要为 select之后的 字段名 2. 如果select之后的字段和group by 之后的 字段不一致,则 必须对 字段 进行聚合处理(聚合函数) having 语句 作用:对查询结果 进一步筛选 注意: 1. having语句通常和 group by联合使用, 过滤由 group by语句 返回的记录集 2. where只能操作表中 实际存在的 字段, having by可操作由聚合函数生成的显示列 distinct 作用:不显示字段 重复值 注意: 1.distinct和from之间 所有字段都相同 才会去重 2.distinct 不能对任何字段做聚合 处理 运算符: + - * / % ## sudo apt-get install python3-pip 安装pip3 ## sudo pip3 install pymysql 安装mysql 约束: 1.作用: 保证数据的 完整性、 一致性、 有效性 2.约束分类 1.默认约束( default) 插入字段时 不给该字段 赋值 则 使用默认值 2.非空约束( not NULL) 不允许该字段值有NULL记录 sex enum(“M”,"F","S") not null defaulf "S" 索引 定义: 对数据库表色一列或多列的 值进行排序的一种 结构 (Btree方式) 优点: 加快数据的 检索速度 缺点: 1.需要 占用物理存储空间 2.当对表中数据更新时,索引需要 动态维护。 降低 数据 维护速度 占用系统资源 运行时间检测: 开启:set profiling=1; 关闭:set profiling=0; 查询MySQL变量:show variables like profiling; 查询执行记录:show profilings; 字段创建索引: create index name on t1(字段名); 索引的分类: 1.普通索引(index) 使用规则: 1.可设置多个字段 2.字段值 无约束 3.key标志: MUL 创建index 创建表时创建 create table(.... ... index(字段名), index(字段名2)...) 已有表添加index create index 索引名 on 表名(字段名); 查看索引: 1.desc 表名; key:MUL 2.show index from 表名 3.show index from\G; 删除索引: drop index 索引名 on 表名; 2.唯一索引(unique) 使用规则: 1.可以设置多个字段 2.约束:字段值不允许重复,但 可以为NULL 3.key标志: UNI 创建unique: 1.创建表时创建 unique(字段名),.. 2.已有表 create unique index 索引名 on 表名(字段名); 查看、删除 和普通索引一致 3.主键索引(primary key) 自增属性( auto_increment, 配合主键一起 使用) 使用规则: 1. 只能有一个主键字段 2. 约束:不允许重复,且 不能为NULL 3.key标志: PRI 4. 通常设置记录编号字段 id,能 唯一锁定一条 记录 创建primary key 创建表时: 1. id int primary key auto_increment, 2. 起始值:表() auto_inctement=10000; 已有表: alter table 表名 add primary key(id); 添加:alter table 表名 modify id int auto_inctement; 删除: 1.删除自增属性(modify) alter table 表名 modify id int; 2.删除主键索引 alter table 表名 drop primary key; 4.外键索引........ 算法全是 btree 节省时间都一样 不同的是约束不同 这里btree 算法 有人说btree就是btree 不是二叉树 但是我觉得就是二叉树 没什么区别 根据数据量的大小 提升速度 快能达到几百倍的提速 数据导入: 作用: 把文件系统的内容导入到数据库 语法: load data infile “文件名” into table 表名 fields terminated by “分隔符” lines terminated by “\n”; 步骤: 1. 数据库中 创建对应的 表 2. 把文件拷贝到数据库的 默认搜索路径中 1.查看默认路径 show variables like “secure_file_priv”; /var/lib/mysql-files/ 2.拷贝文件 sudo cp ~/scoretable.csv /var/lib/mysql-files/ 3.把表导入到数据库 数据导出: 作用: 数据库中表的记录导出到系统文件里 语法: select ... from 表名 into outfile “/var/lib/mysql-files/文件名” fields terminated by “分隔符” lines terminated by “\n”; 步骤: 1.直接执行导出命令 2.自动创建文件 3.默认导出到默认搜索路径 文件权限: rwx rw- rw- 1 tarena tarena 所有者 所属组 rwx:tarena用户 rw-:同组其他用户 rw-:其他组的用户(mysql) r: 4 w: 2 x: 1 最高权限:7 查看权限:ls -l 文件名 修改文件权限: chmod 644 文件名 Excel表格如何 转化为 CSV文件 打开Excel文件 -> 另存为 -> CSV(逗号分隔) 更改文件 编码格式 用记事本/编辑器 打开,文件->另存为->选择编码 导入示例: 3、将scoretable.csv文件导入到数据库的表中 1、在数据库中创建对应的表 create table scoretab( id int, name varchar(15), score float(5,2), number bigint, class char(7) ); 2、把文件拷贝到数据库的默认搜索路径中 1、查看默认搜索路径 show variables like "secure_file_priv"; /var/lib/mysql-files/ 2、拷贝文件 sudo cp ~/scoretable.csv /var/lib/mysql-files/ 3、执行数据导入语句 load data infile "/var/lib/mysql-files/scoretable.csv" into table scoretab fields terminated by "," lines terminated by "\n"; 导出示例: 把MOSHOU库下的sanguo表英雄的姓名、攻击值、国家导出来,sanguo.txt select name,gongji,country from MOSHOU.sanguo into outfile "/var/lib/mysql-files/sanguo.txt" fields terminated by " " lines terminated by "\n"; 将mysql库下的user表中 user、host两个字段的值导出到 user.txt select user,host from mysql.user into outfile "/var/lib/mysql-files/user.txt" fields terminated by " " lines terminated by "\n"; 查询 $ sudo -i $ cd /var/lib/mysql-files/ $ ls $ cat sanguo.txt

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

Python全工程师 (类变量、方法、继承、覆盖)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象的 属于此类对象的方法 实例变量 添加/修改属性: 对象.属性名 = 表达式 删除: del 对象.属性名 类 | 对象 | 实例 class object instance 类的本质上也是对象 类可以创建此类对象 ----------------------------------------------------------------------------------------------------------------- 类: 类变量: 类变量是类的属性, 此属性属于类, 不属于此类的实例 作用: 通常用来储存该类创建的对象的共同属性 说明: 类变量可以通过该类的实例直接访问 类变量可以通过类的实例间接访问 类变量可以通过此类的对象__class__属性间接访问示例: # -*- coding:utf-8 -*- # 类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') print(Human.total_count) # 0 h1 = Human("zhang") print(h1.total_count) # 0 用此类实例访问类变量 h1.total_count = 100 # 为对象添加实例变量 print(h1.total_count) # 100 优先访问实例变量 print(Human.total_count) # 0 访问类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') h1 = Human("zhang") print(Human.total_count) # 0 h1.__class__.total_count = 100 # 为类添加修改实例变量 print(h1.total_count) # 100 间接访问类变量 print(Human.total_count) # 100 访问类变量 # 类变量的应用 用类变量记录实例个数 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') self.__class__.total_count += 1 # 每次创建对象调用__init__ 类变量加1 def __del__(self): self.__class__.total_count += 1 # 每次析构对象后类变量减1 h1 = Human("zhang") print("此时Human对象的个数是", Human.total_count) # 1 L = [] L.append(Human("li")) L.append(Human("zhao")) print("此时Human对象的个数是", Human.total_count) # 3 del h1 L.pop() print("此时Human对象的个数是", Human.total_count) # 1 类的文档字符串: 和函数等一样 用__doc__属性访问示例: >>> class Dog: ... '''这是小动物''' ... >>> help(Dog) >>> Dog.__doc__ '这是小动物' >>> 类 __slots__ 列表: 作用: 限定一个类的创建实例只能有固定的属性(实例变量) 不允许对象添加列表以外的属性(实例变量) 防止用户因错写属性的名称而发生错误 说明: 1.__slots__ 列表绑定一个字符串列表 2.含有__slots__列表的类所创建的实例对象没有__dict__属性 (不用字典储存对象的属性 __slots__限制) 示例: class Human: # 以下列表限制此类对象只能有这两个属性 防止出错 __slots__ = ["name", "age"] def __init__(self, name, age): self.name, self.age = name, age h1 = Human("Ta", 15) print(h1.age) # 15 h1.Age = 18 # 区分大小写 出错 没有Age属性,也不允许有 print(h1.age) # 15 类方法 @ classmethod 类方法是用于描述类的行为的方法 类方法属于类, 不属于类的实例 说明: 类方法需要使用 @classmethod装饰器定义 类方法至少有一个形参, 第一个形参用于绑定类, 约定写“cls” 类和该类的实例都可以调用类的方法 类方法不能访问此类创建的实例的属性示例: # 类方法的使用 class A: v = 0 @classmethod def get_v(cls): # cls 用来绑定调用此方法的类 return cls.v # 访问类变量 @classmethod def set_v(cls, value): cls.v = value print(A.get_v()) # 0 A.set_v(100) print(A.get_v()) # 100 a1 = A() # 创建实例 print("a1.get_v=", a1.get_v) # 100 a1.set_v(200) print("a1.get_v=", a1.get_v) # 200 print("A.get_v=", A.get_v) # 200 静态方法 @staticmethod 静态方法是定义在类内部的函数, 此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同, 不需要传入self实例参数和cls参数 静态方法只能凭借该类的创建实例调用 静态方法不能访问变量和实例变量(属性)示例: # 静态方法 class A: @staticmethod def myadd(a, b): return a + b print(A.myadd(100, 200)) # 300 a = A() # 创建实例 print(a.myadd(300, 400)) # 700 # def myadd(a, b): # 和静态方法结果一样 # return a + b # class A: # pass # print(A.myadd(100, 200)) # 300 # a = A() # 创建实例 # print(a.myadd(300, 400)) # 700 实例方法, 类方法, 静态方法,函数, 小结: 1.不想访问 类内 的和 实例内 的变量, 用静态方法 2.只想访问类变量, 不想访问实例变量, 用类方法 3.既要访问类变量, 也想访问实例变量, 用实例方法 4.函数与静态方法相同, 只是静态方式的作用域定义在类内 继承inheritance/派生derive: 什么是继承/派生: 继承是从已有的类中派生出新的类, 新类具有原类的行为, 并能扩充新的行为 派生是从已有的类中衍生成新类, 在新类上可以添加新的属性和行为 作用: 用继承派生机制, 可以将一些共有的功能加在基类中, 实现代码的共享 在不改变基类的代码的基础上改变原有的功能 名词: 基类(base class) / 超类(super class)/父类(father class) 派生类(derived class)/子类(child class) 子类对象一定是父类对象的类型 父类对象不一定是子类对象的类型单继承: 语法: class 类名(基类名) 语句块 说明: 单继承是指由一各基类衍生出新的类 示例: # 单继承用法 class Human: # 人类的共性 def say(srlf, what): print("说:", what) def walk(self, distance): # 走路 print("走了", distance, "公里") class Student(Human): # 继承 # def say(srlf, what): # print("说:", what) # def walk(self, distance): # 走路 # print("走了", distance, "公里") def study(self, subject): # 派生 print("学习", subject) class Teacher(Student): def teach(self, subject): # 派生 print("教", subject) h1 = Human() h1.say("哈哈") h1.walk(500) s1 = Student() s1.walk(4) s1.say("666") s1.study("python") T1 = Teacher() T1.walk(4) T1.say("666") T1.teach("python") T1.study("Java") 继承说明: python3 任何类都可以直接或间接的继承object类 object类是一切类的超类(父类) class的继承参数不写, 默认继承object类 一般省略不写 object类的超类是None类的__base__属性: __base__ 属性用来记录此类的基类(父类)Python的内建类: help(__builtins__) 覆盖 override 覆盖是指在有继承关系的类中, 子类中实现了与基类同名的方法, 在子类 的实例调用该方法时, 实际调用的是子类的覆盖版本, 这种现象叫覆盖示例: # 覆盖 override class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") b = B() b.works() # B.works被调用 # B.works 覆盖 A.works 优先调用子类 # A派生B B继承A # 子类对象显示调用基类(被覆盖)方法的方式: # 基类.方法名(实例, 实际调用参数) A.works(b) # 用类名显示调用, A.works被调用 super 函数: super(cls, obj)返回绑定超类的实例(要求obj必须是cls类的实例) super() 返回绑定超类的实例, 等同于:super(__class__), 实例方法的第一个参数), 必须在方法内调用 作用: 借助于super()返回实例间接调用其父类的覆盖方法 # 用super函数返回的对象调用父类的覆盖方法 class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") def super_works(self): self.works() # B.works被调用 super(B, self).works() # A.works被调用 super().works() # A.works被调用 b = B() b.works() # B.works被调用 super(B, b).works() # A.works被调用 b = B() b.super_works() # B.works被调用 显示调用基类的初始化方法: 当子类中实现了__init__方法,基类的构造方法不会被调用 def __init__(self, ...) # 用super函数调用父类的覆盖__init__初始化方法 class Human: def __init__(self, n, a): self. name, self.age = n, a print("Human类的 __init__ 方法被调用") def infos(self): print("name:", self.name) print("age:", self.age) class Student(Human): def __init__(self, n, a, s=0): super().__init__(n, a) # 用siper 调用父类的__init__方法 self.score = s # 添加成绩属性 print("Student类的 __init__ 方法被调用") def info(self): super().infos() # 调用父类的方法 print("name:", self.name) print("age:", self.age) print("score:", self.score) # 不调用父类的方法也不会出错 但是尽量不要用 s1 = Student("小张", 20) s1.infos()

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

Python全工程师(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递:例如: def myinput(fn): L = [5, 3, 1, 9, 7] return fn(L) print(myinput(max)) print(myinput(min)) print(myinput(sum)) print(myinput(len)) 函数可以作为另一个函数的返回值:例如: def get_op(): s = input("qing shu ru cao zuo") if s == "zui da": return max elif s == "zui xiao": return min elif s == "he": return sum L = [2, 3, 4, 6,5, 6, 9, 1] print(L) f = get_op() print(f(L)) 函数的嵌套: 函数嵌套定义是指一个函数里用def语句来创建其他的函数 示例: def fn_outter(): print("fn_outter被调用") def fn_inner(): print("fn_inner被调用") fn_inner() fn_inner() print("fn_outter调用结束") fn_outter() Python的作用域: 作用域也叫名字空间,是访问变量时查找变量的范围空间 python的4个作用域: 作用域: 英文解释 缩写 局部作用域(函数内) Local(function) L 外部嵌套函数作用域 Enclosing functio loc E 函数定义所在模块(文件)作用域 Global(module) G python内建模块作用域 Builtin(python) B 包含关系(内建>模块>外部嵌套函数>函数内)变量名查找规则: 访问变量时,先查找本地变量,然后是包裹此函数外的函数内部的变量 ,之后是全局变量,最后是内建变量 L ---> E ---> G ---> B 在默认情况下,变量名赋值会创建或者改变当前作用域的变量global语句: 告诉解释执行器global语句声明一个或多个变量, 这些变量的作用域为模块级别的作用域,也称为全局变量全局声明(global) 将赋值语句操作的变量映射到模块文件内部的作用域 语法: global 变量1, 变量2, .... 说明: 1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是创建局部变量) 2. 全局变量在函数内部不经过声明就可以直接访问(变量已经存在并关联一个对象) 3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则 4. global变量列表里的变量名不能出现在此作用域的形参列表里 nonlocal语句: 告诉解释执行器,nonlocal声明变量不是局部变量,也不是全局变量 它是外部嵌套函数变量 语法: nonlocal 变量名1,变量名2,... 说明: 1. nonlocal 语句只能在被嵌套的函数内部进行使用 2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作 3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作 4. nonlocal语句的变量列表里的变量名,不能出现在此函数的参数列表中 lambda表达式(又称匿名函数)(希腊字母:入) 作用: 创建一个匿名函数对象 同def类似 但是不提供函数名 格式: lambda[ 参数1, 参数...]: 表达式 说明: 1. lambda 只是一个表达式,它用来创建一个函数对象 2. 当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用关系 3. lambda 表达式创建的函数只能包含一条表达式 4. lambda 比函数简单且可以随时创建和销毁,有利于减少程序的偶合度 函数: eval () / exec() 函数 eval(source, globals=None, local=None) 把一个字符串 srouce 当成一个表达式来执行,返回表达式执行的结果 exec(source, globals=None, locals=None) 把一个字符串source 当成程序来执行 练习: 写一个函数叫hello(name),部分代码如下: count = 0 def hello(name): print('你好', name) ... 此处代码省略,需要同学们自己填写 ... 此处代码需要改变全局变量来记录此函数曾经被调用过多少次. hello('小张') hello('小李') print('hello 函数被调用', count, '次') # 2次 count = 0 def hello(name): global count count += 1 print("hello", name) hello("name") hello("xiaoli") hello("xiaoliu") hello("xiaowei") hello("xiaozhang") 1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True, 否则返回False 例: fa = lambda x: ..... print(fa(2)) # True print(fa(4)) # False fa = lambda x: (x ** 2 + 1) % 5 == 0 print(fa(2)) # True print(fa(4)) # False 2. 写一个lambda表达式,求两个变量的最大值 例如: def mymax(x, y): ... mymax = lambda ... print(mymax(100, 200)) # 200 def mymax(x, y): if x > y: return x else: return y print(mymax(100, 200)) # 200 mymax = lambda x, y: x if x > y else y print(mymax(100, 200)) # 200 1. 给出一个整数n,写一个函数myfac来计算n!(n的阶乘) n! = 1 * 2 * 3 * 4 * ..... * n 如: print(myfac(5)) # 120 def myfac(n): x = 1 for i in range(1, n + 1): x = x * i return x print(myfac(5)) 2. 给出一个整数n,写一个函数计算myfn(n): 1 + 2**2 + 3**3 + .... + n**n的和 如: print(myfn(10)) # ??? def myfu(n): s = 0 for x in range(2, n + 1): s += x ** x return s print(myfu(10)) 3. 完全数: 1 + 2 + 3 = 6 (6为完全数) 1,2,3都为6的因数(因数是能被一个数x整除的整数为y,则y为x的因数) 1 x 6 = 6 2 x 3 = 6 完全数是指除自身以外的所有因数相加之和等于自身的数 求 4~5个完全数并打印出来 答案: 6 28 496 ...... def mywqs(x): s = 0 L = [] for i in range(1, x): if x % i == 0: L.append(i) for i in L: s += i if s == x: return True else: return False i = 0 wqs = 0 while wqs < 5: i += 1 if mywqs(i) == True: print(i) wqs += 1 咳咳 又到了吹NB环节 locals()、globals() 就是一个查询函数 以字典形式返回信息而已函数变量? 你就就把它看做一个全局变量 变量绑定数据 而它绑定语句块 就这么简单什么是作用域? 作用域就是变量的所属范围 超过范围就失效 在别的地方一般是3个作用域 而python有4个 内建变量 局部变量 模块全局变量 特殊那个就是两个函数嵌套之间的范围(外部嵌套) 分别都是包含关系(内建>模块>外部嵌套函数>函数内) 内建函数 不可删除或修改 其他作用域 不能与内建函数重名 否则内建函数失效 只作用于当前空间自定义函数 各作用域各不相干 同空间不可重名 global 不管在任何空间使用global都直接声明全局变量 nonlocal 只能在被嵌套函数内部使用 多层嵌套 只会跳一层 lambda 用表达式创建一个函数 和if一样

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

Python全工程师(数值类型、运算符)

ParisGabriel Python 入门基础 python的应用领域: 1.系统运维 2.网络编程(如:网络爬虫,搜索引擎,服务器编程) 3.科学计算 4.航空领域(如:卫星,导弹,等) 5.人工智能,机器人 6.web开发、 7.云计算 8.大数据以及数据库开发 9.教育 10.游戏,图像处理 等等。。 python的优点: 1.面向对象(java、C++、python、C#、swift) 2.开源免费 3.跨平台(windows、Linux、Unix、iOS、Android) 4.混合编程(C、C++、java、.net) 5.应用领域广泛 python的缺点: 1.执行速度没有C、C++快、较慢的java、相对而言也比较慢 2.源代码不能加密 python的组成: 1.程序是由模块组成的 2.模块是由数据、函数、支持库、类等组成的 3.函数是由语句块组成的 4.语句块是有表达式组成的 Python的核心数据类型: (整数int,浮点数float,复数complex,布尔型bool、 字符串 str 列表 list 等) 1.十进制表示方式10 200 -100 999八进制:0o177(127)0o11(9) 2.十六进制:0x11(17)0xff(255)0x1a2b3.二进制:0b1110b101 整形数 int整数是不带小数的部分数字正数负数0浮点数:float带有小数部分的数字 复数分为两部分:实部(real)虚部(image)虚部是j或J结尾的数字面值:1j(2J)1+2J3-4Jbool有两种1.true 代表条件成立2.false 代表条件不成立true的值是1false的值是0 内置对象: None 是一个表示不存在的特殊对象(空值) 用来占位或解除变量的绑定 表达式: 由数字、数字和运算符组成 通常让计算机做一些事会返回结果 算数运算运算符: 1.+ 加法 2.- 减法 3.* 乘法 4./ 除法 5.// 地板除 6.** 幂运算 7.% 取余 / 除法: 得到的是浮点数 不会丢弃小数位 // 地板除: 得到的是整数型 字节舍去所有小数(没有四舍五入) % 取余: 取整除后所剩余的余数(7%3=1) ** 幂运算: 优先级: 1.** 2.* / // % 3.+ - 4.()内的优先级最高 优先级越高越先执行 同等优先级 从左往右依次执行 混合类型自动升级: 整数加浮点数结果为浮点数 基本输入函数: print(格式:print(要打印的内容)) 多个数据类型要用“,”分开 变量: 变量就是关联一个对象的标识符并且区分字母大小写 标识符的命名: 必须以下划线或字母开头,后面跟字母、下划线、整数 不能使用Python的关键字命名 赋值运算符: “=” 语法: 变量名=表达式 变量名1=变量名2=表达式 变量名=表达式=序列 创建一个变量,此变量用来绑定数据对象 修改一个变量的绑定关系 让其绑定另一个对象 当变量不存在时创建变量 同事将对象绑定在变量上 当变量存在时改变变量的对象 一个人变量只能绑定一个对象 一个对象可以绑定多个变量 序列赋值: a,b = 100,200 Python的自动化内存管理: a=a+b 释放a a=a+b的和 变量的交换: 交换算法: >>> a=10 >>> b=20 >>> a=a+b >>> b=a-b >>> a=a-b >>> a 20 >>> b 10 第三变量: >>> a=20 >>> b=10 >>> c=a >>> a=b >>> b=c >>> a 10 >>> b 20 序列赋值: >>> a=10 >>> b=20 >>> a,b=20,10 >>> a 20 >>> b 10 >>> 删除变量: del >>> del a 删除变量的同时解除与对象的关联关系,如果能则释放对象 help(“——main——”) tarena@tedu:~$ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 100 >>> help("__main__") 在交互模式下查看当前作用域的所有变量 Q退出查看 自动化内存管理和引用计数: 每个对象都会记录有几个变量绑定自身,当引用的数量为0时则此对象将被销毁 并且释放内存资源 此种自动化内存管理的方式叫引用计数 is/is not 运算符作用:判断两个对象是否是一个对象,当是同一个对象时返回true否则返回 falseis not返回值与is相反 id(obj)函数: 返回一个对象在内存中的地址(id(对象) 小整数对象值:CPython中 ,整数-5到256的数永远存在于小数池中不会释放且可重复使用符合赋值算数运算符:y += x 等同于 y = y + xy -= x 等同于 y = y - xy *= x 等同于 y = y * xy /= x 等同于 y = y / xy //= x 等同于 y = y // xy %= x 等同于 y = y % xy **= x 等同于 y = y ** x 练习:写程序打印出1.古代的秤是16两一斤 请问216两是几斤几两 print("Answer to question 1:") print(216 // 16, "axe", 216 % 16, "liang") 2.冲凌晨0:0:0计时 到现在已经过了63320秒 现在是几时几分几秒 print("Answer to question 2:") time = 63320 time // 3600 a = time % 3600 a // 60 a % 60 print(time // 3600, "小时", a // 60, "分钟", a % 60, "秒") 3.温度转换:摄氏度=5.0/9.0*(华氏度-32)请问100华氏度是多少摄氏度?如果当前温度是摄氏度温度能否算出华氏度温度是多少? print("Answer to question 3:") a = 5.0 / 9.0 * (100 - 32) print("100华氏度=", a, "摄氏度") a = 100 * 9 / 5 + 32 print("100摄氏度=", a, "华氏度")

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

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

用户登录
用户注册