月度归档: 2021 年 4 月

tkinter禁止关闭窗口

tkinter禁止关闭窗口

 

from tkinter import *
import tkinter.messagebox as messagebox

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()

def createWidgets(self):
self.tiplabel = Label(self, text=’输入“我是帅哥”,退出该程序’)
self.tiplabel.pack()
self.valueInput = Entry(self)
self.valueInput.pack()
self.alertButton = Button(self, text=’验证’, command=self.proof)
self.alertButton.pack()

def proof(self):
keyvalue = self.valueInput.get()

if keyvalue == ‘我是帅哥’:
messagebox.showinfo(‘提示’, ‘你的自我认知很对’)
root.destroy()
else:
messagebox.showerror(‘错误’, ‘我觉得你可以考虑一下’)

def callback():
messagebox.showwarning(‘警告’,’回答问题’)

root = Tk()
root.geometry(‘300×150’)
app = Application().pack()
root.protocol(“WM_DELETE_WINDOW”, callback)
root.mainloop()

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()

def on_closing():
if messagebox.askokcancel(“Quit”, “Do you want to quit?”):
root.destroy()

root.protocol(“WM_DELETE_WINDOW”, on_closing)
root.mainloop()

numpy常见操作

numpy常见操作

【1】数组创建及填充
import numpy as np

#[1]————————————————————
# 生成一个数组
#range生成
array1=np.arange(10,20,2)
print(array1)

#linspace生成
array2=np.linspace(10,20,20)
print(array2)
print(type(array1))

#[2]————————————————————
# 0数组和1数组以及其他数组
array3=np.zeros((3,4),dtype=int)
print(array3)

array4=np.ones((5,4),dtype=int)
print(array4)

#0填充
array31=np.zeros_like(array4,dtype=int)
print(array31)

#1填充
array41=np.ones_like(array3,dtype=int)
print(array41)

#任意数值填充
array5=np.full_like(array41,10)
print(array5)

#[3]N维数组属性————————————————————
array6=np.arange(1,21).reshape(4,5)
print(array6)
#显示维度
print(array6.ndim)
#显示形状
print(array6.shape)
#显示大小
print(array6.size)
【2】数组、矩阵的基本运算
import numpy as np

#[1]数组的基本运算————————————————————
array1=np.arange(1,11,1).reshape(2,5)
print(array1)

array2=np.arange(1,11,1).reshape(2,5)
array3=np.full_like(array2,2)
print(array3)

#基本运算,元素度元素
array4=array1+array3
print(array4,”\n”)

array5=array1-array3
print(array5,”\n”)

array6=array1*array3
print(array6,”\n”)

array7=array1/array3
print(array7,”\n”)

#[2]点乘运算————————————————————
#2.1 dot()函数运算
array8=np.arange(1,21,1).reshape(4,5)
print(array8,”\n”)

array9=np.arange(1,21,1).reshape(5,4)
print(array9,”\n”)

array10=np.dot(array8,array9)
print(array10,”\n”)

#2.2 转换为mat矩阵在进行运算
array81=np.mat(array8)
print(array81,”\n”)

array91=np.mat(array9)
print(array91,”\n”)

array11=array91*array81
print(array11,”\n”)

”’
einsum()并不是一个简单的求和运算方法,而是一个高效的符号计算规则,
它可实现矩阵的各种求和操作(如点乘、转置、矩阵求迹等),被称为NumPy的“暗宝”
”’
#[3]einsum()运算————————————————————

#3.1一维数组求和
print(“-“*40)
a=np.arange(1,11)
b=np.einsum(‘i->’,a)
print(b)

#3.2二维数组求和
print(“-“*40)
a1=np.arange(1,21).reshape(4,5)
print(a1)
b1=np.einsum(‘ij->i’,a1)
c1=np.einsum(‘ij->j’,a1)
print(b1)
print(c1)

#3.3矩阵乘法
print(“-“*40)
a3=np.arange(1,21).reshape(4,5)
b3=np.arange(1,21).reshape(5,4)
c3=np.einsum(‘ij,jk->ik’,a3,b3)
print(c3)

#3.4向量点集
print(“-“*40)
a4=np.arange(1,21).reshape(4,5)
b4=np.arange(1,21).reshape(5,4)
c4=np.einsum(‘ij,jk->’,a4,b4)
print(c4)

#3.5 取对角线元素
print(“-“*40)
a5=np.arange(1,17).reshape(4,4)
c5=np.einsum(‘ii->i’,a5)
print(c5)

#3.6 取对角线的迹
print(“-“*40)
a6=np.arange(1,17).reshape(4,4)
c6=np.einsum(‘ii->’,a6)
print(c6)

#3.7 矩阵转置
print(“-“*40)
a7=np.arange(1,16).reshape(3,5)
c7=np.einsum(‘ij->ji’,a7)
print(a7)
print(c7)
【3】*大值、*小值、均值、求和

import numpy as np

”’
np.reshape()作用是将原来的数组变换形状,不改变数组元素数量,要求更改后的数组元素总数不变。
np.resize()作用是改变数组的大小和形状,会改变数组元素数量,如果更改后的数组元素比原数组的多,
则用原数组中的元素充填补齐
”’
a=np.arange(1,13).reshape(3,4)
print(a)

b=np.sum(a,axis=0)
print(‘-‘*50)
print(b)

b=np.sum(a,axis=1)
print(‘-‘*50)
print(b)

b=np.mean(a,axis=0)
print(‘-‘*50)
print(b)

b=np.max(a,axis=0)
print(‘-‘*50)
print(b)

b=np.max(a,axis=(0,1))
print(‘-‘*50)
print(b)

【4】分割和拼接

import numpy as np

”’
堆叠方式大致分为水平方向堆叠(horizontal stack)、
垂直方向堆叠(vertical stack)、深度方向堆叠(depth-wise stack)等。
”’
#————————————-(1)堆叠————————————————
a=np.arange(1,13).reshape(3,4)
#水平方向堆叠
b=np.hstack((a,a))
print(b)
print(‘-‘*50)

#竖直方向堆叠
c=np.vstack((a,a))
print(c)
print(‘-‘*50)

#深度方向堆叠
d=np.arange(10,21)
e=np.arange(40,51)
f=np.arange(70,81)
g=np.dstack((d,e,f))
print(g)
print(‘-‘*50)

#二维列堆叠等价于水平方向堆叠
c1=np.arange(1,13).reshape(3,4)
c2=np.arange(21,33).reshape(3,4)
print(c1)
print(c2)
c3=np.column_stack((c1,c2))
print(c3)
print(‘-‘*50)

#二维行堆叠等价于竖直方向堆叠
c1=np.arange(1,13).reshape(3,4)
c2=np.arange(21,33).reshape(3,4)
print(c1)
print(c2)
c3=np.row_stack((c1,c2))
print(c3)
print(‘-‘*50)

#一维列堆叠
c1=np.arange(1,13)
c2=np.arange(21,33)
print(c1)
print(c2)
c3=np.column_stack((c1,c2))
print(c3)
print(‘-‘*50)

#一维行堆叠
c1=np.arange(1,13)
c2=np.arange(21,33)
print(c1)
print(c2)
c3=np.row_stack((c1,c2))
print(c3)
print(‘-‘*50)

#————————————-(2)分割————————————————
”’
NumPy也提供了数组的分割操作。和堆叠类似,分割也包括水平方向分割、
垂直方向分割和深度方向分割,分别用hsplit()、vsplit()和dsplit()实现。
类似于concatenate()方法可通过设置轴方向,既实现水平方向堆叠,又实现垂直方向堆叠,
split()也可以通过设置分割方向,分别实现hsplit()、vsplit()和dsplit()的功能。
”’

d1=np.arange(1,17).reshape(4,4)

#竖直方向分割
d2=np.vsplit(d1,2)
print(d2)
print(‘-‘*50)

#水平方向分割
d2=np.hsplit(d1,2)
print(d2)
print(‘-‘*50)

#水平按三列分割
d2=np.hsplit(d1,[1,2])
print(d2)
print(‘-‘*50)

#竖直按三行分割
d2=np.vsplit(d1,[1,2])
print(d2)
print(‘-‘*50)

【5】随机数

import numpy as np

#设置随机种子
rdm=np.random.RandomState(1)

#随机分布
r1=np.random.rand(2,3)
print(r1)
print(‘-‘*50)

#正太分布
r1=np.random.randn(2,3)
print(r1)
print(‘-‘*50)

#某个范围随机整数分布
r1=np.random.randint(1,10,(2,3))
print(r1)
print(‘-‘*50)

#某个范围随机数分布
r1=np.random.random((2,3))
print(r1)
print(‘-‘*50)

AndroidStudio下的APP目录结构介绍

Project Name:工程项目名称
Application Name:当前应用发布以后的名字,例如QQ图标下面的名字是“QQ”,就是Application Name.

Android Studio工程目录

1、.gradle和.idea
这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑。
2、app
项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解。
3、build
这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。
4、gradle
这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启动gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏 –> File –> Settings –> Build,Execution,Deployment –> Gradle,进行配置更改。
5、.gitignore
这个文件是用来将指定的目录或文件排除在版本控制之外的。
6、build.gradle
这是项目全局的gradle构建脚本,通常这个文件的内容是不需要修改的。下面回详细分析gradle构建脚本中的具体内容。
7、gradle.properties
这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
8、gradlew和gradlew.bat
这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的。
9、HelloWorld.iml
iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容。
10、local.properties
这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,我们并不需要修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。
11、settings.gradle
这个文件用于指定项目中所有引入的模块。由于HelloWorld项目中就只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

app目录结构

除了app目录之外,大多数的文件和目录都是自动生成的不需要我们进行修改,下面我们详细介绍app目录结构。

1、build
这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更多更杂,我们不需要过多关系。
2、libs
如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
3、src/AndroidTest
此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
4、src/main/java
毫无疑问,java目录是放置我们所有java代码的地方,展开该目录,你将看到我们刚才创建的HelloWorldActivity文件就在里面。
5、src/main/res
这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
6、main/AndroidManifest.xml
这是你整个Android项目的配置文件,你在程序中定义的所以四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
7、test
此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8、.gitignore
这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似。
9、app.iml
IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10、build.gradle
这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
11、proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。

项目中的资源

展开res目录看一下,其实里面的东西还是挺多的,很容易让人看得眼花缭乱,如下图:

以drawable开头的文件夹都是用来放图片的;
以mipmap开头的文件夹都是用来放应用图标的;
以values开头的文件夹都是用来放字符串、样式、颜色等配置的;
layout文件夹是用来放布局文件的。

Android项目包名命名规范及常见项目架构

在Java中我们通常把具备相同或相似功能的一些类放在同一个包中,当然 不同公司会有不同的命名方式,但大体都相同,一个好的命名应见名知义,提高代码可读性,以利于后期代码的修改与维护。下面基于我自己做项目中的一些感触谈谈自己对包命名规范的理解。

一.Java包命名规范

1)包(packages): 采用反写域名命名规则,即com.xx.xxx.xxxx形式
     全部使用小写字母。一级包名为com,二级包名为xx(一般为公司或个人域名),三级包名根据应用进行命名,四级包名为功能模块名。如:com.tencent.qq.activitys,这样具备较高可读性,一看就知道是腾讯公司QQ软件中存放activity的包。
下面是一些常见的包命名组织方式。
com.example.app.activitys 用来组织Activity类
com.example.app.base 基础共享的类,如多个Activity共享的
BaseActivity或整个应用共享的MyApplication类
com.example.app.adapter 项目中用到的适配器类
com.example.app.view 自定义的View,如常用的TitleBarView
com.example.app.util 工具类,如HttpUtil,ImageUtil,FileUtil
com.example.app.db 数据库类,如DataBaseHelper,MessageDB
com.example.app.service 服务类,如GetMsgService
com.example.app.constant 常量类
com.example.app.domain/modle/entity 元素实体类,如对应注册用户信息的User类,
对应聊天信息的TextMessage类
com.example.app.broadcast 广播服务类

2)资源布局文件(XML文件(layout布局文件)):全部小写,采用下划线命名,我一般按照组件名_功能名_属性名方式

如:activity_login,fragment_constact_child.这样当你在Activity的onCreate中使用R.layout.的时候就只需筛选activity开头的xml文件,在Fragment的onCreateView中使用R.layout.的时候就只需筛选fragment开头的xml文件,这样就可以缩小聚焦范围,而且这样的命名具备较高的可读性,很容易知道fragment_constact_child表示某个ConstactFragment类中的child视图。
3)控件:全部小写,采用下划线命名,我一般按照布局文件名_控件名_功能名_属性名方式(前面的布局文件名可选可不选,选的话具备较高的可读性)

如:fragment_constact_child_img_avatar表示fragment_constact_child布局文件中的用户头像的ImageView。

二.常见项目框架

无论是用移动客户端还是PC端的项目,一般都包括三个模块:用户交互层,业务逻辑层,数据持久层
1)用户交互层:呈现给用户的界面模块,应考虑界面性能的高低
          因为要考虑良好的用户体验,所以必须考虑流畅度,让用户在使用App的时候不能感到卡顿
          如:在重新加载某个控件时先判断先前该控件的实例是否存在,若存在直接返回,不存在再创建。
  如在ExpandableListView的ExpandableListAdapter的getChildView代码如下:

[html]  view plain  copy

  1. <span>        </span>public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
  2.                 // TODO Auto-generated method stub
  3.                 GroupHolder holder = null;
  4.                 if (convertView == null) {
  5.                     convertView = LayoutInflater.from(mContext).inflate(
  6.                             R.layout.fragment_constact_child, null);
  7.                     holder = new GroupHolder();
  8.                     holder.nameView = (TextView) convertView
  9.                             .findViewById(R.id.contact_list_item_name);
  10.                     holder.feelView = (TextView) convertView
  11.                             .findViewById(R.id.cpntact_list_item_state);
  12.                     holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
  13.                     convertView.setTag(holder);
  14.                 } else {
  15.                     holder = (GroupHolder) convertView.getTag();
  16.                 }
  17.                 holder.iconView.setImageResource(R.drawable.head);
  18.                 holder.nameView.setText(getChild(groupPosition, childPosition)
  19.                         .toString());
  20.                 holder.feelView.setText(signString[groupPosition][childPosition]);
  21.                 return convertView;
  22.             }
2)业务逻辑层: 整个项目的核心,不仅仅要考虑功能的实现,还应考虑性能的高低
在功能上就没啥好说,因为不同App一般要实现的功能不同,在性能上一般可以考虑一下几个层面:
2.1)多线程:这个在网络请求中用的比较多。
可以使用线程池,AsyncTask类,Thread+Handler异步消息机制或其它一些比较好的第三方开源库。
2.2)内存:这个主要是图片处理及缓存

1. 加载大图片时,合理设置BitmapFactory.Options的值inSampleSize,减少图片内存占用;

2. 仅请求图片的大小,inJustDecodeBounds = true仅请求图片大小,而不会加载图片到内存;

3. 缓存图片:内存缓存使用lruCache,磁盘缓存使用 DiskLruCache;

4. 使用非UI线程加载图片,使用 AsyncTask;

5. 使用软引用SoftReference

3) 数据持久层:这个一般用来保存用户的信息,磁盘文件及数据库文件
 这三层图示如下:

求大家推荐服务器?

我用服务器做 WordPress 博客,用虚拟主机不能做 ssl 很无语,而阿里云单单做个博客太大材小用了?用西部数码感觉不好用,网速慢,求大家推荐大公司,稳定,便宜网速快的服务商,我买一台做博客。再买一台做私有云

jixiangqd 2
jixiangqd 2017-04-19 11:51:29 +08:00 ❤️ 1
直接用 cnblogs 之类的博客系统就好了,不舍的花钱,还要装出逼格?
Kilerd 3
Kilerd 2017-04-19 11:54:13 +08:00 via iPhone
hostker
crll 4
crll 2017-04-19 12:13:30 +08:00
hostker 确实不错
CEBBCAT 5
CEBBCAT 2017-04-19 12:15:28 +08:00 via Android
又没说要你提供这样的服务,怎么上来就开喷?
110male 6
110male 2017-04-19 13:00:47 +08:00
买服务器托管
ivmm 7
ivmm 2017-04-19 13:04:50 +08:00
谷歌搜索:

Managed WordPress Hosting

$20 刀一个月的,基本上都能满足你的需求,快速、稳定,免维护,高可用
yujizmq 8
yujizmq 2017-04-19 13:05:18 +08:00 via Android
hostker 没毛病
Diss 9
Diss 2017-04-30 01:15:47 +08:00
https://www.daimiyun.com/cart.php?gid=4

黛米云虚拟主机,来吧,免费送你个玩,支持 SSL.。
woshinide300yuan 10
woshinide300yuan 2017-05-03 20:54:57 +08:00
趁*近阿里云新注册用户免费半年的活动没过期,抓紧来一发!

TOPNETS 11
TOPNETS 2017-05-11 15:39:16 +08:00
试试互联先锋 www.idcicp.com
thinkxen 12
thinkxen 2017-05-15 22:04:08 +08:00
阿里云吧 价格很低了~~~
jack2411868 13
jack2411868 2017-06-04 20:32:44 +08:00
6 月*新活动-超值实用 VPS 推荐
http://www.yqvps.com/?p=137
togodo 14
togodo 2017-09-13 22:29:53 +08:00
现在有阿里云的 199 一年活动,用买空间的钱买个服务器。http://blog.csdn.net/cuitang1031/article/details/77727217
lae 15
lae 2018-12-28 19:35:23 +08:00 via Android
直接用的国外的,tophosting.github.io

idc 托管 vs ucloud 物理云主机

我对这方面基本属于完全不懂…只是大概了解了一下,

idc 托管: 10m 4-9k/month

ucloud 物理主机: (32 核 /64g/480g*6)+10m 大概 5225/month

托管有什么我不知道的好处?没有的话,这 ucloud 性价比碾压啊… 省很多事儿还不贵…

esile 1
esile 2017-08-03 02:05:58 +08:00 via iPhone
差别二手服务器搞一台,托管特别实惠
misty8873 2
misty8873 2017-08-03 02:08:12 +08:00 via iPad
如果是北京 bgp 的话,我有信息可以做到价格合适,因为我做 idc 的
thinkxen 3
thinkxen 2017-08-03 11:44:39 +08:00 ❤️ 1
自己买一台服务器,然后托管*实惠~~~
10M BGP 带宽不要北上广的话,可以做到 1500-2000 差不多可以~~~
wangzhangwei 4
wangzhangwei 2017-08-03 12:16:38 +08:00 ❤️ 1
托管:
1、企业独享硬件资源,性能好,云是共享资源平台
2、安全性高,全部数据在自己的物理机上,不会被云厂商抓取数据
3、可控性强,如果出问题,可随时进入机房处理,而云出问题只能云厂商处理。

云主机:*大的特点是弹性扩容和维护方便,至于价格,少量代配云主机成本是比较低的,如果量大之后云主机成本和托管是差不多,有的会比托管贵(有的企业自己买高配物理服务器自己做虚拟化)。

有的 IDC 厂商也提供混合云,机房提供服务器托管服务,然后在同一个机房提供云主机服务,通过光纤打通云主机和托管服务器内网,这样对数据敏感的可以用托管,新项目、WEB 站可以放在云平台上。
hahaDashen 5
hahaDashen 2017-08-03 19:40:03 +08:00 ❤️ 1
IDC 托管:16 核心 32G 1Thdd 100M 1k/mo
hahaDashen 6
hahaDashen 2017-08-03 19:40:43 +08:00
这些云服务商的价格还是贵 但是可能服务上要更细致到位一点
QQ2171775959 7
QQ2171775959 2017-08-04 14:10:04 +08:00
托管费用比租用便宜,长期用的比较划算,具体的可以聊聊。
tedchen 8
tedchen 2017-08-04 14:56:09 +08:00
@hahaDashen 我这儿调研了一下,北京的机房托管+10m 流量大概每个月 2.4k. 你这个 1k 是哪儿的呀请问
tedchen 9
tedchen 2017-08-04 14:59:53 +08:00
@wangzhangwei 调研了一下,我这边就 4-6 台,买服务器+托管的话感觉可能还是云划算一点哈哈。
wangzhangwei 10
wangzhangwei 2017-08-04 15:38:42 +08:00
@tedchen 如果物理机器 不做虚拟化,成本要比云方案高的。
@hahaDashen 您这个估计是 100M 共享带宽的费用吧。

wangzhangwei 11
wangzhangwei 2017-08-04 15:42:13 +08:00
@tedchen 还是要强调一些,创业初期,云主机数量和带宽较少,成本是比较低,但随着用户量上升,云成本和托管的成本差不多,甚至比托管还要贵。用云*主要的是弹性好,维护方便,也是未来的一个趋势。
hahaDashen 12
hahaDashen 2017-08-04 21:06:18 +08:00
@tedchen
@wangzhangwei
百兆独享 绍兴的
wangzhangwei 13
wangzhangwei 2017-08-07 09:49:18 +08:00
@hahaDashen 绍兴是单线的,而且地方也有点偏啊
hahaDashen 14
hahaDashen 2017-08-07 12:14:20 +08:00
@wangzhangwei 镇江之类的这个价格都能搞到 要三线的百兆价格也不超过 2K 三个 IP 电信 联通 移动
wintab 15
wintab 2017-08-15 14:49:37 +08:00 ❤️ 1
睿江云 eflycloud.com 大概 3650/月 BGP 带宽,多个节点可选择。。
togodo 16
togodo 2017-09-13 22:26:34 +08:00
如果对性能要求多,而且系统不是云架构,那么*对选择托管啊

Android命名规范

Android命名规范(重点讲解:包名)

Android程序开发中,使用规范的命名有益于程序的开发和后期阅读。本文主要对Android程序包名的定义做详细介绍,并附带一些简单的命名规则。

一.标识符命名方法
1 .小驼峰命名法,除首单词外,其余所有单词的*个字母大写。如:allPrice,getAllNames
2.大驼峰命名法,所有单词的*个字母大写。如:GuideActivity,StudentInfoBean
3.下划线命名法:单词与单词间用下划线做间隔。如:activity_main,select_backGround_color
二.命名规范
(一)包(packages)的命名规范:
采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名lwz(为个人或公司名称,可以简写),三级包名guidecity(根据应用进行命名),四级包名ui或utils等(模块名或层级名),根据实际情况也是可以用五级包名,六级包名。
这里的四级包名是要重点理解和分类的,例如:com.lwz.应用.utils ,此包中包含:公共工具方法类

1.utils
此包中包含:公共工具方法类,比如:SPHelperUtil、TimeUitl、FileUtil等

2.adapter
此包中包含:一些适配器的类,比如:ArticleAdapter、FansAdapter,HistorAdaper等

3.base
此包中包含:一些共同类的基类,比如:BaseActivity(所有的Activity类都继承这个类)、BaseFragment(所有的Fragment都继承这个类),ListItemAdapter(封装了Base Adapter的基类)等

4.bean
此包中包含:一些属性对象类,比如:StudentBean、LonginBean、ArticleBean等

5.config
此包中包含:*顶级的配置类,比如:MyApp(继承了Application)

6.httpservice
此包中包含:Http数据的请求接口类,好像Retrofit网络框架请求网络数据才要使用。如:ILogin接口,IAddTopic接口,IUpdate等

7.interface
此包中包含:某个页面或对象的所用操作接口类,这个接口主要是定义这个对象的所有方法。如:IUser接口,IArticle接口,ITopic接口等

8.model
这是MVC或MVP框架设计中的M。此包中包含:某个页面或对象的所用操作类,这个类继承了上面定义的interface接口,重写并实现厘米那的方法。如:UserModel,ArticleMode类,TopicMode类等

9.ui
这个ui表示的页面的意思,也是MVC或MVP中的V,很多人把这个包名写成activity,其实是不准确的,因为ui包含了activity和fragment,所以ui是四级包名,而activity和fragment是ui包下的五级包名。
activity此包中包含:Activity对象类。如:MainActivity类,HomeActivity类,FansListActivity类等。如果是使用了MVP框架模式,activity包名下还可以有六级包名,比如:loginMVP(包含ILoginView接口类,LoginPresenter类)、seleteTopicMVP
fragment此包中包含:Fragment对象类。但是Fragment一般都是多个存在的,所以fragment包下一般还有六级包名,表示里面是哪个页面的Fragment对象。

10.weight
此包中包含:自定义View或自定义对话框等视图类。如:CursroDialog类,SpringScrollView类,ScrollListView类等

11.db
此包中包含:数据库操作类

12.service
此包中包含:Service服务类

13.broadcast
此包中包含:Broadcast广播接收者类

14.provider
此包中包含:Provider内容提供者类(用得很少)

包名规划我感觉对程序后期阅读或修改有很大的帮助,特别是很大的程序,文件太多,不规划的话自己都不知道这个类是干什么的!
当然如果程序中没有这一类的文件,这个包名是可以不写,但是一些基本的包名,基本每个程序都是需要的比如:ui、utils、adapter、weight、bean等

(二)类(classes)的命名规范:
一般用名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

以下是部分示例说明:
1.activity 类,如欢迎页面类WelcomeActivity.
2.adapter类,如商品详情适配器ProductDetailAdapter
3.util公共方法类,如:线程池管理类:ThreadPoolManager,日志工具类:LogUtil
4.db数据库类,以DBHelper后缀标识。如城市数据库:CityDBHelper
5.Service类,以Service为后缀标识
6.BroadcastReceive,以Broadcast为后缀标识
7.ContentProvider,以Provider为后缀标识

(三)接口(interface):
命名规则与类一样采用大驼峰命名法,多以able或ible结尾或以I开头,如Runnable、Accessible、IUser。

(四)方法(methods)的命名规则:
一般使用动词或动名词,采用小驼峰命名法 例如:onCreate(),run()

>1.initXXX()初始化相关方法,使用init为前缀标识
2.isXXX()、checkXXX() 方法返回值为boolean型的请使用is或check为前缀标识
3.getXXX()返回某个值的方法,使用get为前缀标识
4.processXXX() 对数据进行处理的方法,尽量使用process为前缀标识
5.displayXXX() 弹出提示框和提示信息,使用display为前缀标识
6.saveXXX() 与保存数据相关的,使用sav为e前缀标识
7.resetXXX() 对数据重组的,使用reset前缀标识
8.clearXXX()removeXXX() 清除数据相关的,使用clear或remove为前缀标识
9.drawXXX() 绘制数据或效果相关的,使用draw前缀标识

(五)变量(variables)采用小驼峰命名法。类中控件名称一般与xml布局id保持一致
(六)常量(constants)全部大写,采用下划线命名法.例如:MIN_WIDTH
(七)XML文件(布局文件):全部小写,采用下划线命名法,
例如:main_activity.xml, item_activity.xml、homeposter_item_poster.xml

(八)资源文件(图片): 全部小写,采用下划线命名法,加前缀区分
命名 说明

(九)动画文件(anim包):全部小写,采用下划线命名法,加前缀区分。
动画命名例子:

(十)资源ID(resources id):大小写规范与方法名一致,采用小驼峰命名法。
命名规范为“资源控件的缩写名”+“变量名”。例如TextView的id=“tv_userName”。注意:页面控件名称应该和控件id名一般是一致,例如:TextView tv_userName=(TextView)findViewById(R.id.tv_userName);

三.图解包名规范示例
本文主要是想对程序包名的命名规划,这里展示我之前开发的程序的包名图片,供大家参考:

(一)总显示


上面example这个包名一般是不用的!

(二)ui包下
fragment展示

activity 展示:


(三)utils和weight包下


(四)res文件夹下的部分文件展示:


drawable包下:


layout包下:


上面就是一个完成程序的主要文件展示,这个程序大概有三百多个文件(包括java文件和资源文件),这里就不一一展示了!
大家可以想象一下,如果这个程序包名和文件名都没有很好规划,那么你要找你想要的几个文件是一个多么麻烦的事情!
一般地,我在创建每个java程序文件都会在上面做几句话的注解,说明一下这个文件的作用,有些布局文件也是有简单说明。这样更加有利于后期的程序代码迭代或版本更新!
命名规范是必须的吗?有些是!有些不是。比如包名、类的定义,系统没有硬性规定,但是资源文件res文件夹下的命名,系统要求资源文件名必须小写,否则,你的程序一直运行不了,你都不知道为啥。

*后说一句:程序开发中命名规范是一个很好的开发习惯!

查看安卓app包名的几种方法

包名(Package name)在Android系统中是判断一个App的唯一标识,不同的App可以有同样的名字,但是它的包名不可以相同

例如我可以自己编译生成一个App也叫“微信”,但是我App的包名不能为com.tencent.mm(微信的包名为这个),如果我指定的包名和微信一致了,那么我的手机上只允许安装这两个App中的其中一个

说到这很多人就会有疑问,如果有人恶意做了一个和微信内容一模一样的App,名字和包名都和微信一样,那怎么分辨呢?Android中为了防止这样,还做了一个叫签名的东西,微信的签名一般我们是没有的,所以就可以通过签名来标识出这款App到底是谁的了,有兴趣了可以了解下签名。

手机查看:

以小米手机为例,打开设置-更多应用-查找到此应用-点击右上角更多信息 即可查看包名

命令行查看:

具体如下:

方法一:
输入命令:adb shell am monitor
然后启动需要获取包名的应用

方法二:
adb shell pm list packages -3
查看自己安装的app包名

方法三:
安卓系统中:设置——应用——正在运行 查看

方法四:
安卓系统中:文件管理器访问目录/data/data下,文件夹即为包名

方法五:
将apk包反编译后,打开AndroidManifest.xml,搜索package获取包名

python推导式

python推导式

python推导式
初学python,可以评论互相交流,
# 列表推导式格式:
# 格式:[表达式 for 变量 in 旧列表] 不带条件
# [表达式 for 变量 in 旧列表 if 条件] 带条件
#将1-100之间能被3和5整除的数,组成一个新的列表
# newlist = [i for i in range(1,101) if i%3 == 0 and i%5 == 0]
# print(newlist)
# 利用0~5数字,在一个元组中前一个为偶数,后一个为奇数
#使用函数完成
# [(偶数,奇数),(),(),] [(0,1),(0,3),(0,5)…]
# def func():
# newlist = []
# for i in range(5):
# if i%2 == 0:
# for j in range(10):
# if j%2 != 0:
# newlist.append((i,j))
# return newlist
# x = func()
# print(x)
# 利用推导式完成
# newlist = [(x,y) for x in range(5) if x % 2 == 0 for y in range(10) if y % 2 != 0]
# print(newlist)
# 列表里有列表
# list1 = [[1,2,3],[4,5,6],[7,8,9],[1,3,5]]
# newlist = [i[2] for i in list1]
# print(newlist)
#含if和else的推导式
# if 薪资大于5000加200 else低于等于5000加500
# dict1 = {‘name’:’tom’,’salary’:4900}
# dict2 = {‘name’:’lucy’,’salary’:6000}
# dict3 = {‘name’:’jack’,’salary’:8000}
# dict4 = {‘name’:’lily’,’salary’:4000}
# list1 = [dict1,dict2,dict3,dict4]
# newlist = [employee[‘salary’]+200 if employee[‘salary’]>5000 else employee[‘salary’]+500 for employee in list1]
# print(newlist)

# 集合推导式 {},类似列表推导式,多加了去除重复的功能
# list1 = [1,2,3,1,3,5,2,8,9,87,78]
# set1 = {x for x in list1 if x>5 }
# print(set1)

# 字典推导式 交换键和值的值
# dic1 = {‘a’:’A’,’b’:’B’,’c’:’C’,’d’:’C’}
# newdict = {value:key for key,value in dic1.items()}
# print(newdict)

nms 算法演示(附代码)

nms 算法演示(附代码)

NMS_DEMO 动图演示
”’一共9个框,前4列是坐标(xyxy格式),*后一列是置信度”’
boxes=np.array([
[100,100,210,210,0.72],#0
[280,290,420,420,0.8],#1
[220,220,320,330,0.92],#2
[105,90,220,210,0.71],#3
[230,240,325,330,0.81],#4
[305,300,420,420,0.9],#5
[215,225,305,328,0.6],#6
[150,260,290,400,0.99],#7
[102,108,208,208,0.72]])#8

”’按置信度从高到低排序(框对应的索引)”’
order: [7 2 5 4 1 8 0 3 6]

左图是原始的框(没经过nms操作的框):
黄色填充的框是按置信度排序后,被选中保留的框

右图是nms操作后的框:
每选中保留一个框,就会计算它跟余下的框的iou,iou大于0.7(人为设置)则剔除
注意:这里余下的框是不包括之前已经确定保留的框

左图的题目keep表示保留的框的id,score表示保留的框的置信度
右图的题目keep表示保留的框的id,delete表示需要剔除的框(保留的框与其iou>0.7)

介绍一下步骤:
所有框按置信度从高到低进行排序:[7 2 5 4 1 8 0 3 6] (框的索引)

从置信度*高的那个框(7)开始,(7)已经保留,那么就会跟(0)~(6)、(8)剩下的8个框比较iou,iou都<0.7,全部保留

接着确定置信度排第2的框(2),(7,2)已经保留,那么就会跟(0)、(1)、(3)、(4)~(6)、(8)剩下的7个框比较iou,其中(4)、(6)iou>0.7,剔除

接着确定置信度排第3的框(5),(7,2,5)已经保留,那么就会跟(0)、(1)、(3)、(8)剩下的4个框比较iou,其中(1)iou>0.7,剔除

接着确定置信度排第4的框(8),(7,2,5,8)已经保留,那么就会跟(0)、(3)剩下的2个框比较iou,其中(0)、(3)iou>0.7,剔除

完整代码
import numpy as np
import matplotlib.pyplot as plt

def py_cpu_nms(nms_show, dets, thresh):# nms操作
“Pure Python NMS baseline”
# x1、y1、x2、y2以及score赋值
x1 = dets[:,0]
y1 = dets[:,1]
x2 = dets[:,2]
y2 = dets[:,3]
scores = dets[:, 4]

areas = (y2-y1+1) * (x2-x1+1) #每一个检测框的面积
print(“all_areas:”,areas)

order = scores.argsort()[::-1]# 按照score置信度降序排序
print(“order:”,order)

keep = [] # 保留的结果框集合
k=0
show_boxid = order
print(“show_boxid”,show_boxid)
while order.size > 0:
i = order[0] # every time the first is the biggst, and add it directly
keep.append(i) # 保留该类剩余box中得分*高的一个
print(“\nkeep(被留下来的框id):”,keep)
# 得到相交区域,比左上大和比右下小
”’np.maximum(X, Y, out=None) X和Y逐位进行比较,选择*大值”’
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
print(“xx1,yy1:”,xx1,yy1)
print(“xx2,yy2:”,xx2,yy2)
print(“w,h:”,xx2-xx1+1,yy2-yy1+1)
#plt.scatter([xx1,xx2], [yy1,yy2], s=50, c=’y’)#框左上角蓝色

# 计算相交的面积,不重叠时面积为0
w = np.maximum(0, xx2-xx1+1) # the weights of overlap
h = np.maximum(0, yy2-yy1+1) # the height of overlap
inter = w*h
print(“w*h:”,inter)
# 计算IoU:重叠面积 /(面积1+面积2-重叠面积)
iou = inter / (areas[i]+areas[order[1:]] – inter)
print(“—iou:”,iou)
# 保留IoU小于阈值的box
”’去掉keep剩下的框按顺序重新排序”’
indx = np.where(iou<=thresh)[0]
dedx = np.where(iou>thresh)[0]
print(“order[0]:”,order[0])
show_boxid = np.delete(show_boxid,np.where(show_boxid==order[0])[0],axis = 0)
print(“show_boxid:”,np.append(keep,show_boxid))
delete_boxid = show_boxid[dedx]
show_boxid = show_boxid[indx]
#print(“indx:”,indx)
print(“after_iou_show_boxid:”,np.append(keep,show_boxid))
print(“after_iou_delete_boxid:”,delete_boxid,’\n’)
k=k+1
”’绘制动图”’
ax1 = nms_show.add_subplot(1,2,1)
ax1.set_title(‘begin_nms {} \nkeep:{} score:{}({})’.format(k,order[0],scores[order[0]],k))
plot_bbox(dets, ‘k’, show_ids=np.arange(9) , keep_id = order[0])

ax2 = nms_show.add_subplot(1,2,2)
ax2.set_title(‘after_nms {} \nkeep:{} delete:{}(iou={})’.format(k,order[0],delete_boxid,iou[dedx]))
plot_bbox(dets[np.append(show_boxid,keep)], ‘b’, np.append(show_boxid,keep))
plt.pause(5)
ax1.remove()
ax2.remove()
”’置信度排前的数值给取出,剩下的数构成新的数组”’
order = order[indx+1]
print(“———–afer_order:”,order,’———–‘)
return keep

def plot_bbox(dets, c=’k’, show_ids=[],keep_id=0):
x1 = dets[:,0]
y1 = dets[:,1]
x2 = dets[:,2]
y2 = dets[:,3]
score=dets[:,4]
#print(dets.shape)
#plt.scatter(x1, y1, s=25, c=’b’, alpha=0.6)#框左上角蓝色
#plt.scatter(x2, y2, s=25, c=’r’, alpha=0.6)#框右下角红色
plt.plot([x1,x2], [y1,y1], c)
plt.plot([x1,x1], [y1,y2], c)
plt.plot([x1,x2], [y2,y2], c)
plt.plot([x2,x2], [y1,y2], c)
plt.xlim((60,450))
plt.ylim((450,60))
”’改变坐标轴位置”’
ax = plt.gca()
ax.spines[“top”].set_color(“k”)
ax.xaxis.set_ticks_position(“top”)

for i in range(len(show_ids)):
plt.text(x1[i], y1[i]+7, “(%d)%.2f”%(show_ids[i],score[i]), \
fontdict={‘size’: 10, ‘color’: ‘r’},bbox={‘facecolor’:’blue’, ‘alpha’:0.1})
if keep_id != 0:
ax.add_patch(plt.Rectangle((x1[keep_id], y1[keep_id]), x2[keep_id]-x1[keep_id]+1, y2[keep_id]-y1[keep_id]+1,
color=”y”, fill=True, linewidth=2))

def main():
boxes=np.array([
[100,100,210,210,0.72],#0
[280,290,420,420,0.8],#1
[220,220,320,330,0.92],#2
[105,90,220,210,0.71],#3
[230,240,325,330,0.81],#4
[305,300,420,420,0.9],#5
[215,225,305,328,0.6],#6
[150,260,290,400,0.99],#7
[102,108,208,208,0.72]])#8 #9个框

plt.ion()
fig = plt.figure(figsize=[14,9])
ax1 = plt.subplot(1,2,1)
ax1.set_title(‘before_nms’)

ax2 = plt.subplot(1,2,2)
ax2.set_title(‘after_nms’)

plt.sca(ax1)# 选择子图1
plot_bbox(boxes,’k’,show_ids=np.arange(9),keep_id=0) # before nms

keep = py_cpu_nms(fig, boxes, thresh=0.7)
print(“last_keep:”,keep)
plt.ioff()
plt.pause(2)
plt.close(‘all’)

if __name__ ==”__main__”:
main()

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速