『壹』 以下Python代碼else為啥沒和if對齊,這里else起什麼作用
這個else是跟if裡面的for都(py的一個語法)。就是當for循環不是break退出的時候就會運行else的代碼
『貳』 c# 列印里圖片這么讓png的高清大圖按比例縮小,
// <summary>
/// 生成縮略圖
/// </summary>
/// <param name="originalImagePath">源圖路徑(物理路徑)</param>
/// <param name="thumbnailPath">縮略圖路徑(物理路徑)</param>
/// <param name="width">縮略圖寬度</param>
/// <param name="height">縮略圖高度</param>
/// <param name="mode">生成縮略圖的方式</param>
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW": //指定高寬縮放(可能變形)
break;
case "W": //指定寬,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H": //指定高,寬按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut": //指定高寬裁減(不變形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//新建一個bmp圖片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一個畫板
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//設置高質量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//設置高質量,低速度呈現平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空畫布並以透明背景色填充
g.Clear(System.Drawing.Color.Transparent);
//在指定位置並且按指定大小繪制原圖片的指定部分
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
try
{
//以jpg格式保存縮略圖
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
『叄』 跪求這張圖片的超清或高清圖片 可以做壁紙的那種
提取碼:9qa9
『肆』 我需要一張單片機最小系統圖,黑白清晰的~
給你個程序你看看吧,看不懂那我也沒辦法了,自己借書看吧
publicsealedclassCRC
{
privatestaticushort[]CRC16Table=null;
privatestaticuint[]CRC32Table=null;
()
{
if(CRC16Table!=null)return;
CRC16Table=newushort[256];
for(ushorti=0;i<256;i++)
{
ushortvCRC=i;
for(intj=0;j<8;j++)
if(vCRC%2==0)
vCRC=(ushort)(vCRC>>1);
elsevCRC=(ushort)((vCRC>>1)^0x8408);
CRC16Table[i]=vCRC;
}
}
//設計ZswangY372007-02-14
()
{
if(CRC32Table!=null)return;
CRC32Table=newuint[256];
for(uinti=0;i<256;i++)
{
uintvCRC=i;
for(intj=0;j<8;j++)
if(vCRC%2==0)
vCRC=(uint)(vCRC>>1);
elsevCRC=(uint)((vCRC>>1)^0xEDB88320);
CRC32Table[i]=vCRC;
}
}
publicstaticushortUpdateCRC16(byteAByte,ushortASeed)
{
return(ushort)(CRC16Table[(ASeed&0x000000FF)^AByte]^(ASeed>>8));
}
publicstaticuintUpdateCRC32(byteAByte,uintASeed)
{
return(uint)(CRC32Table[(ASeed&0x000000FF)^AByte]^(ASeed>>8));
}
publicstaticushortCRC16(byte[]ABytes)
{
MakeCRC16Table();
ushortResult=0xFFFF;
foreach(bytevByteinABytes)
Result=UpdateCRC16(vByte,Result);
return(ushort)(~Result);
}
publicstaticushortCRC16(stringAString,EncodingAEncoding)
{
returnCRC16(AEncoding.GetBytes(AString));
}
publicstaticushortCRC16(stringAString)
{
returnCRC16(AString,Encoding.UTF8);
}
publicstaticuintCRC32(byte[]ABytes)
{
MakeCRC32Table();
uintResult=0xFFFFFFFF;
foreach(bytevByteinABytes)
Result=UpdateCRC32(vByte,Result);
return(uint)(~Result);
}
publicstaticuintCRC32(stringAString,EncodingAEncoding)
{
returnCRC32(AEncoding.GetBytes(AString));
}
publicstaticuintCRC32(stringAString)
{
returnCRC32(AString,Encoding.UTF8);
}
}
『伍』 c語言的if和else後面的語句怎麼回事 我接下來准備在這張圖片中的zhekou後面添加一個p
if (condition) AAAAAAAA; else BBBBBB;
ccccc; 直接寫就好了,和 elese無關,
但是建議你寫成 if (condition) { AAAAAAAA; } else {BBBBBB;} cccccc;
這樣,更容易理解
『陸』 python中else的必須有么
if可以不帶else,但這是由邏輯需求決定的。
比如這里,如果你的邏輯是當price小於等於2時輸出1、2,其它則輸出3,就必須帶else。
否則,像你的代碼,當price小於等於2時,就會輸出:
1
2
3
而這是不符合假設的邏輯需求的。
所以,這里就必須帶else。
『柒』 C語言中,if……else if結構中,可以省略最後的一個else嗎如果可以,那是為什麼呢如圖
帶不帶else都是語法所容許的,都可以通過編譯,然而帶和不帶並不等效,所以不能稱之為省略。
這里的x=-0;這一條語句沒有帶else,表示它並不受前面的條件控制。
這道題分析的時候,主要利用if不帶花括弧的情況下只管最近的一條語句這一點,不要被不科學的縮進格式所迷惑。這樣簡單分析後,不難發現x=-0;根本就沒有在任何一層if塊內,不管怎樣都會執行到。
『捌』 求else的Paris的百度雲鏈接
使用網路網盤免費分享給你,鏈接:https://pan..com/s/12O8kdfEOLokTyZSkF-mN1A
《Paris》是美國紐約電音樂隊煙鬼組合(TheChainsmokers)製作、煙鬼組合成員安德魯·塔格特與美國女歌手EmilyWarren合作錄唱的一首電子舞曲[1],作為TheChainsmokers首張錄音室專輯《Memories...DoNotOpen》的首支推廣單曲被發行於2017年1月12日。
『玖』 能詳細地解釋下這個if和else起的作用嗎
是的沒有錯,圖片中就是俗稱的垃圾程序,或者說錯誤的程序。有些bug也可能是蓄意留下的。
這里代碼的本意,應該是要校驗起始行終止行是否滿足被8整除,如果不能就強行向後面撐滿。由於y被重復使用,因此失去了意義。
『拾』 有那位大佬能看出來上面的字是什麼,或者可以用ps變得清晰一點
一 . 前言
BeanPostProcessor 是 Spring 的核心組件之一 , Bean 實現 BeanPostProcessor 可以實現很多復雜的功能
二 . PostProcessor 的結構 2.1 介面方法
該介面中主要提供了2種 , 其中提供了前置調用和後置調用 . 還可以看到 , 這里通過 default 修飾 , 所以並不是強制重寫的
public interface BeanPostProcessor { default Object (Object bean, String beanName) throws BeansException { return bean; } default Object (Object bean, String beanName) throws BeansException { return bean; }}2.2 常見實現類
這里可以看到 , AOP , 定時 , 配置等都實現了相關的集成
三 . Spring 源碼深入分析 3.1 使用案例
這一部分來看一下 Spring 內部是如何使用 PostProcessor 特性的 , 這一部分以 為例.
@Overridepublic Object (Object bean, String beanName) { // 可以看到 , 前置處理並沒有太多處理 , 直接返回 return bean;}@Overridepublic Object (Object bean, String beanName) { if (bean instanceof AopInfrastructureBean || bean instanceof TaskScheler || bean instanceof ScheledExecutorService) { // Ignore AOP infrastructure such as scoped proxies. return bean; } // Step 1 : 開始特殊處理 Class targetClass = AopProxyUtils.ultimateTargetClass(bean); if (!this.nonAnnotatedClasses.contains(targetClass) && AnnotationUtils.isCandidateClass(targetClass, Arrays.asList(Scheled.class, Scheles.class))) { // Step 2 : 獲取 Method 對應 Scheled 的集合 Map> annotatedMethods = MethodIntrospector.selectMethods(targetClass, (MethodIntrospector.MetadataLookup>) method -> { Set scheledAnnotations = AnnotatedElementUtils.( method, Scheled.class, Scheles.class); return (!scheledAnnotations.isEmpty() ? scheledAnnotations : null); }); if (annotatedMethods.isEmpty()) { this.nonAnnotatedClasses.add(targetClass); } else { // Step 3 : 方法不為空 , 執行 Process annotatedMethods.forEach((method, scheledAnnotations) -> scheledAnnotations.forEach(scheled -> processScheled(scheled, method, bean))); } } return bean;}
PS : 後面就不看了 , 主要就是通過一個 ScheledTask 運行 Runable 對象
從具體的使用上 , 不難看出 , 他是在創建Bean的時候去做補充的操作 , 那麼下面來看一下具體的處理流程
這個流程在Bean 初始化流程 中進行了全面的跟蹤 , 這里更關注其中的一些細節
3.2 Before/After 調用流程
入口一 : # initializeBean 調用
其中流程也比較簡單 , for 循環所有的 BeanPostProcessors 進行處理
3.3 BeanPostProcessors 的管理// 在 AbstractBeanFactory 中有一個集合用於管理 BeanPostProcessorprivate final List beanPostProcessors = new ();// 不論是哪種類型 ,都會通過以下2種方式進行調用 , 先刪除, 後添加public void addBeanPostProcessors(Collection beanPostProcessors) { this.beanPostProcessors.removeAll(beanPostProcessors); this.beanPostProcessors.addAll(beanPostProcessors);}public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { this.beanPostProcessors.remove(beanPostProcessor); this.beanPostProcessors.add(beanPostProcessor);}
可以通過手動添加的方式 ,實現 BeanPostProcessor 的添加 , 參考對象 AbstractApplicationContext
protected void prepareBeanFactory( beanFactory) { // ............. // Configure the bean factory with context callbacks. beanFactory.addBeanPostProcessor(new (this)); // .............}
哈哈 , 又到了這個地方 , 之前看 Refresh 代碼的時候就注意到了這個地方 , 會注冊相關的 BeanPostProcessors
protected void registerBeanPostProcessors( beanFactory) { // Step 1 : 調用 進行注冊 .registerBeanPostProcessors(beanFactory, this);}
源碼注釋非常清晰 ,這里就是簡單翻譯了一下
public static void registerBeanPostProcessors( beanFactory, AbstractApplicationContext applicationContext) { // postProcessor 數組列表 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // processor 計數 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; //注冊BeanPostProcessorChecker,當bean在BeanPostProcessor實例化期間創建時,即當bean不符合所有BeanPostProcessors處理的條件時,該checker會記錄信息消息 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); // 區別 PriorityOrdered, internalPostProcessor List priorityOrderedPostProcessors = new ArrayList<>(); List internalPostProcessors = new ArrayList<>(); // 有序化 List orderedPostProcessorNames = new ArrayList<>(); List nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); // 運行時用於合並bean定義的後處理器回調介面 if (pp instanceof ) { internalPostProcessors.add(pp); } } // 如果實現了 Ordered 介面 , 則需要有序處理 else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // 首先,注冊實現prioritordered的BeanPostProcessors sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 接下來,注冊實現Ordered的BeanPostProcessors List orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof ) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 現在,注冊所有常規的BeanPostProcessors List nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof ) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // 最後,重新注冊所有內部BeanPostProcessors sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); // 將用於檢測內部bean的後處理器重新注冊為ApplicationListeners,將其移動到處理器鏈的末端 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}四 . 深入定製 4.1 添加 BeanPostProcessor
PS : 當然 , 這種方式過於復雜 , 適用場景不多
@Autowiredprivate DefaultListableBeanFactory beanFactory;@Bean(initMethod = "initMethod")public CommonService getCommonService() { // 通過 BeanFactory 進行添加 beanFactory.addBeanPostProcessor(new CustomizePostProcessor()); return new CommonService();}
上面分析的時候也看到 , 實現了介面就自動添加了
五 .問題補充 5.1 與四種常見的初始化方式有什麼區別 ?
回顧一下四種初始化運行的方式 :
實現 InitializingBean 介面方法 afterPropertiesSet
實現 ApplicationRunner 介面方法 run(ApplicationArguments args)
方法標注註解 @PostConstruct
@Bean(initMethod = "initMethod") 通過註解指定
: ------> this is @PostConstruct <-------: ------> this is InitializingBean <-------: ------> this is in @Bean(initMethod = "initMethod") <-------: ------> this is <-------: ------> this is <-------: ------> this is <-------: ------> this is <-------: ------> this is <-------: ------> this is <-------: Started DemoApplication in 0.822 seconds (JVM running for 2.597): ------> this is ApplicationRunner :getCommonService <-------
調用次數: 四種方法只會調用一次 ,而 和 會在每個Bean創建的時候調用
調用時機: 集中在每個 BeaninitializeBean環節調用
六. 我們能用它干什麼 ?
這里不討論是否真的有場景會使用 ,只是發散思維 , 去思考如何利用他的特點去做點什麼
6.1 結合設計模式
代理是 postProcess 最合適的使用之一 , AOP 即使用了他的特性進行的代理 , 我們可以模擬 AOP , 去做一個更偏向於業務的靜態代理模式 .
同時也可以實現裝飾器模式 , 對 Bean 的處理進行加強 .
// 統一介面public interface Sourceable { void method();}// 對應實現類 (實際業務類)@Servicepublic class Source implements Sourceable { @Override public void method() { System.out.println("the original method!"); }}
public class AopProxyImpl implements Sourceable { private Sourceable source; public AopProxyImpl(Sourceable source) { super(); // 注意 ,代理模式是在代理類中創建一個對象 // this.source = new Source(); // 修飾模式是傳入對應的對象 this.source = source; } @Override public void method() { before(); source.method(); atfer(); } private void atfer() { System.out.println("after proxy!"); } private void before() { System.out.println("before proxy!"); }}
@Servicepublic class AopPostProcessor implements BeanPostProcessor { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public Object (Object bean, String beanName) throws BeansException { logger.info("------> AopPostProcessor <-------"); return bean; } @Override public Object (Object bean, String beanName) throws BeansException { logger.info("------> AopPostProcessor <-------"); if (bean instanceof Sourceable) { logger.info("------> AopPostProcessor build Aop <-------"); AopProxyImpl proxy = new AopProxyImpl((Sourceable)bean); return proxy; } return bean; }}
這里如果沒有 , 則一定會拋出 , 因為 Spring 會去堅持類是否匹配
這里我們屬於靜態代理 , 其實還可以更活用的使用cglib 動態代理
還有很多種整合設計模式的方式可以靈活使用
6.2 Manager 管理指定類型對象
這種方式是在 postProcessor 中對指定的Bean 進行一個管理記錄
大概的使用方式是准備一個BeanManager , 然後在 postProcessor 中進行管理
@Componentpublic class BeanManager { // 對特殊的Bean 進行分組 private static Map typeOne = new ConcurrentHashMap(); private static Map typeTwo = new ConcurrentHashMap(); // PS : 這種方式適合處理更復雜的場景 , 簡單場景可以考慮通過 ApplicationContext.getBean 獲取對應的類}public Object (Object bean, String beanName) throws BeansException { logger.info("------> ManagerPostProcessor <-------"); if (bean instanceof TypeBean) { logger.info("------> AopPostProcessor build Aop <-------"); beanManager.getTypeOne().put(beanName, (TypeBean) bean); } return bean;}// PS : 實際上和注入的是同一個對象------> typeOne.get("typeBeanImpl") == (typeBean) :true <-------
這是最簡單的使用方式 , 相對更復雜的還可以整合註解 , 整合介面或者父類 , 或者僅記錄class信息等方式 ,達到自己的業務效果
6.3 注入特殊屬性
從圖片中我們可以看到 , BeanPostProcessor 是在 PopulateBean 環節之後進行處理的 , 那麼我們可以通過這個環節 , 對 Bean 中的屬性進行修飾 , 常見的使用想法包括 :
為特定屬性設置動態代理
從 Remote 端獲取屬性 , 並且設置
這個就比較好理解了 , 實際上這個時候包括RestTemplate 都已經載入完成 , JDBC 也可以使用 , 在這個時候完全可以從遠端獲取配置信息
// 作用一 : 使用 JDBC (JPA 應該也已經載入可用) , 從資料庫獲取配置 , 判斷當前類是否有特定註解 , 刷新註解的配置// 作用二 : 調用遠端配置中心 , 自定義刷新配置// 作用三 : 刷新特殊的屬性或者對象等等
特殊對象的刷新有多種任意的使用 , 可以根據自己的業務靈活運用
6.4 其他思路
這里只是拋磚引玉 , 歡迎大佬們提出自己的想法
重構屬性
定製化過程中對類進行覆蓋
總結
主要在 initializeBean 調用環節
除了initializeBean外還在多個環節被調用, 包括 等等幾個 Factory 去實例化的過程中
避免循環 , ManagerPostProcessor 不會處理自己
BeanPostProcessor 在每個 bean 創建時都會調用 ,過多會影響啟動效率
BeanPostProcessor 主要在populateBean 之後 , 注意前後順序